数据结构

堆内存和栈内存区别

瘦欲@ 提交于 2020-03-17 07:44:23
(1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。 (2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间! (3) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。 堆:顺序随意 栈:先进后出 堆和栈的区别

【数据结构与算法之美】哈希算法(下):哈希算法在分布式系统中有哪些应用?

六月ゝ 毕业季﹏ 提交于 2020-03-17 07:15:33
一、负载均衡 1.1.需求 如何实现一个会话粘滞(session sticky)的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。 1.2.解决方案 通过哈希算法对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个IP过来的请求都路由到同一个后端服务器上。 二、数据分片 2.1.如何统计“搜索关键词”出现的次数? ①需求描述 假如我们有1T的日志文件,这里面记录了用户的搜索关键词,我们想要快速统计出每个关键词被搜索的次数,该怎么做呢? ②问题分析 这个问题有两个难点,第一个是搜索的日子很大,没办法放到一台机器的内存中。第二个是只用一台机器来处理这么巨大的数据,处理时间会很长。 ③解决方案 先对数据进行分片,然后采用多台(比如n台)机器进行处理。具体做法:从搜索记录的日志文件中依次读取每个关键词,并通过哈希函数计算该关键词的哈希值,然后跟机器的台数n取模,最终得到值就是该关键词应该被分到的机器编号,这样相同的关键词一定会被分配到同一台机器上,数据分配完成后,由多台机器并行进行统计,最后合并起来就是最终结果。 实际上,这里的处理过程也是 MapReduce 的基本设计思想。 2.2.如何快速判断图片是否存在图库中? ①需求描述 假设现在我们的图库中有1亿张图片

【数据结构】哈希表及其模拟实现

十年热恋 提交于 2020-03-16 18:37:19
一.哈希及其概念 通过一定的哈希函数,确定元素的存储位置。搜索效率较高,为O(1) 负载因子:存储元素个数/总表格长度 若大于一定值需要扩容 二.常见的哈希函数 直接定址法:hashfunc(date)=A*date+B;【A,B为常数】 除留余数法:hashfunc(date)=date%capacity【capacity为表格容量】 平方取中法:将数据平方后取中间三位。 折叠法:例 12345 12+34+5=51 三.哈希冲突 不同元素计算出的存储位置(哈希地址)相同 四.解决哈希冲突 1.前期需有效减少哈希冲突的发生--------》哈希函数设计要合理 哈希函数的值域必须在表格范围内 哈希函数要尽可能使元素分布均匀 哈希函数要尽可能简单 2.发生哈希冲突后如何解决 闭散列:从哈希冲突的位置,找下一个空余位置插入元素 开散列:将哈希冲突的元素按链表的形式挂在结点位置 五.闭散列 从哈希冲突的位置,找下一个空余位置插入元素。寻找方式有两种,线性探测和二次探测。 1.线性探测 直接向后+1查找。 优点:简单 缺点:容易造成数据堆积。一个冲突造成很多数据都冲突。 2.二次探测 H(i)=H0+i^2; 或者H(i)=H0- i^2; 优点:解决了数据堆积问题 缺点:可能要查找多次 3.初始化,需设置标志位【EX,EM,DE】 DE需要的原因,此位置不可以插入元素,也不可设置为EM

数据结构之二叉树

限于喜欢 提交于 2020-03-16 14:57:13
某厂面试归来,发现自己落伍了!>>> 概念: 二叉树是一种特殊的树,其每个节点最多只能有两个子节点。其左子树和右子树是有顺序的,顺序不能颠倒。即使只有一个节点,也要区分左右子树。 斜树: 二叉树中每个节点只有相同方向,全部节点只有左子节点的称为左斜树,只有右子节点的称为右斜树。 满二叉树: 所有的分支节点都具有左子树和右子树,所有的叶子节点都在同一层上,满二叉树追求树的平衡。 满二叉树具备一下特点: 叶子节点只能出现在最下面一层。 非叶子节点的度数一定是2。 在同样深度的二叉树中,满二叉树的节点个数最多,叶子树最多。 完全二叉树: 对一棵具备n个节点的二叉树,对每个节点按照层序编号。如果编号为i的节点,与同样深度的满二叉树编号为i的节点在二叉树的同样位置,那么这棵二叉树就是完全二叉树。满二叉树一定是完全二叉树,完全二叉树不一定树满二叉树。 完全二叉树具备以下性质: 叶子节点只能出现在最下一层。 最下层的叶子节点一定出现在左部的连续位置。 倒数第二层的叶子节点一定出现在右部的连续位置。 同样节点数的二叉树,完全二叉树的深度最小。 性质: 一般二叉树的性质: 在非空二叉树的i层上,最多有2^(i-1)个节点。 在深度为k的二叉树上,最多有2^k-1个节点。 对于一棵非空的二叉树,如果叶子节点的个数为n0,度数为2的节点的个数为n2,则有n0=n2+1。 在一棵二叉树中,除了叶子节点

C语言数据结构-绪论

瘦欲@ 提交于 2020-03-16 06:29:37
目录 1.数据结构的起源 2.基本概念和术语 3.逻辑结构与物理结构 4.抽象数据类型 @(数据结构绪论) 1.数据结构的起源 ==数据结构==是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的关系和操作等相关问题的学科。 1968年,美国的高德纳(Donald E.Knuth)的《计算机程序设计艺术》第一卷《基本语法》中,较系统地阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构的课程体系。同年(1968年),数据结构作为一门独立的课程,在计算机科学的学位课程中开始出现。 程序设计 = 数据结构 + 算法 2.基本概念和术语 ==数据==:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据不仅仅包括整型、实型等 数值类型 ,还包括字符及声音、图像、视频等 非数值类型 它是计算机程序加工的“原料”。例如,一个利用数值分析方法解代数方程的程序,其处理对象是整数和实数。一个编译程序或文字处理程序的处理对象是字符串。 数据,其实就是 符号 ,并且具备两个前提 可以输入到计算机中。 能被计算机程序处理。 数值类型可以进行数值计算。 字符类型需要进行非数值的处理。而声音、图像、视频等是通过编码的手段变成字符数据来处理的。 ==数据元素==:是组成数据的、有一定意义的 基本单位 ,在计算机中通常作为整体处理。也被称为 记录 。

Python数据结构与算法分析(笔记与部分作业)

与世无争的帅哥 提交于 2020-03-16 03:40:50
最近为了给写搬砖脚本增加一些算法知识,脑残的看起来算法书。Python数据结构与算法分析,本人英语比较差,看的是翻译版本的。 网上有免费的原版的:https://runestone.academy/runestone/books/published/pythonds/index.html 不废话,开笔记,第一章Python基础,最后的反向思路就稍微卡住了我一下。 第1章,导论 计算机科学的研究对象是问题、解决问题的过程,以及通过该过程得到的解决方案。算法就是解决方案。 计算机科学可以定义为:研究问题及其解决方案,以及研究目前无解的问题的科学。 编程是指通过编程语言将算法编码以使其能被计算机执行的过程。如果没有算法,就不会有程序。 Python支持面向对象编程范式。这意味着Python认为数据是问题解决过程中的关键点。在Python以及其他所有面向对象编程语言中,类都是对数据的构成(状态)以及 数据能做什么(行为)的描述。由于类的使用者只能看到数据项的状态和行为,因此类与抽象数据类型相似的。 在面向对象编程范式中,数据项被称为对象。一个对象就是类的一个实例。 上两个书中的完整代码: def gcd(m,n): while m%n != 0: oldm = m oldn = n m = oldn n = oldm%oldn return n class Fraction: def _

数据库 基本概念

泄露秘密 提交于 2020-03-15 23:20:58
1、关系 (1) 数据模型 :通常由 数据结构 、 数据操作 、 数据的完整性约束条件 组成   常用的 数据模型 :   层次模型、网状模型 、 关系模型 。。。 (2) 关系 :关系模型中的 数据结构 非常简单,只包含单一的数据结构,即关系。在用户看来,关系即一张 二维表   关系 有三种类型: 基本关系 / 基本表 / 基表 、 查询表 、 视图表 (3) 基本关系 的6条性质: 列是同质的,即每一列的值/分量,来自同一个域 不同列可来自同一个域 列的顺序无所谓 行的顺序无所谓 任意两个元组 / 记录的候选码不能取相同的值 分量必须取原子值,即每一个分量必须是不可分的数据项 2、 关系操作 : 查询、插入、删除、修改   (1)查询: 选择、投影、除、并、差、交、笛卡尔积 ,其中:【投影、选择、并、差、笛卡尔积】是 5种基本操作 3、 关系数据语言 4、 关系完整性 ,即对关系的某种约束条件 关系模型中三类完整性约束: 实体完整性、参照完整性、用户定义完整性   (1)实体完整性 :主属性不能为空【空指:不知道 / 不存在 / 无意义 的值】   (2)参照完整性:定义的是外码和主码之间的引用规则 例如:学生中的专业号取值: 一种为空,一种为非空,且该值必须是专业中的专业号的值 5、 关系代数 是一种抽象的查询语言,对关系的运算来表达查询 ,分为 传统的集合运算 和

ES6学习之路7----set数据结构

一世执手 提交于 2020-03-15 15:15:12
什么是set ES6提供了数据结构Set。类似于数组,但是 没有重复值 。 1. Set本身是一个构造函数 ,用来生成Set数据结构 对set数据结构进行操作的方法 add(value):添加某个值, 返回Set结构本身 。 delete(value):删除某个值, 返回一个布尔值 ,表示删除是否成功。 has(value): 返回一个布尔值 ,表示该值是否为Set的成员。 clear():清除所有成员, 没有返回值 。 let set = new Set(); let arr = [1,2,3,4,5,6,5,4,7,3]; //利用add方法将每个值添加到set中 arr.forEach(current => set.add(current)); console.log(set);//{1, 2, 3, 4, 5, 6, 7} //循环set,查看每个成员 for(let val of set){console.log(val);}//1 2 3 4 5 6 7 //利用delete删除5,再查看set console.log(set.delete(5));//true console.log(set);//{1, 2, 3, 4, 6, 7} //删除8,由于不存在,所以删除不成功,返回false console.log(set.delete(8));//false

C#数据结构-链表

◇◆丶佛笑我妖孽 提交于 2020-03-15 05:29:24
理论基础: 链表是用一组任意的存储单元来存储线性表中的数据元素。 如果结点的引用域只存储该结点直接后继结点的存储地址,则该链表叫单链表(Singly Linked List)。 单链表由头引用H唯一确定。头引用指向单链表的第一个结点,也就是把单链表第一个结点的地址放在H中。 C#实现: 1接口 引用线性表的接口IListDS<T> 2实现 首先,必须定义一个单链表的节点类 public class Node<T> { private T data; //数据域 private Node<T> next; //引用域 public Node(T val) { data = val; next = null; } public Node() { data = default(T); next = null; } public T Data { get { return data; } set { data = value; } } public Node<T> Next { get { return next; } set { next = value; } } } 实现主体类 Append,Insert,InsertBack三个方法实质上都是插入操作,可以考虑用overload或者override来实现,有兴趣的朋友试试。 public class LinkList<T> :

Redis 基础数据结构

僤鯓⒐⒋嵵緔 提交于 2020-03-15 01:03:50
string (字符串) 是一种键值对的数据结构,定义一个唯一的key值来获取相应的value数据。 > set name codehole OK > get name "codehole" > exists name (integer) 1 > del name (integer) 1 > get name (nil) 批量操作 > set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一个列表 1) "codehole" 2) "holycoder" 3) (nil) > mset name1 boy name2 girl name3 unknown > mget name1 name2 name3 1) "boy" 2) "girl" 3) "unknown" 可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。 > set name codehole > get name "codehole" > expire name 5 # 5s 后过期 ... # wait for 5s > get name (nil) > setex name 5 codehole # 5s 后过期,等价于 set+expire > get name "codehole" .