数据结构 表 table 串 string

表 table:线性表、非线性表

线性表:数组(顺序存储结构),链表(单链表,双链表,循环链表)


栈:n个元素进栈,有C(n,2n) / (n+1)种可能的出栈顺序


数组是一种随机存取的存储结构


二分查找:n个元素,先比较(min+max)/2,偏大则比较(min+mid-1)/2,否则(mid+1+max)/2

n个元素最多查找log(n+1)次(向上取整),即完全二叉树存下n个元素要几层


三元组表示稀疏矩阵:

每个元素要用行号,列号,元素值来表示,在用三元组表示稀疏矩阵,还要三个成员来记住,矩阵的行数列数,总的元素数


string的二进制haffman编码:根据字符在字符串出现频率,构造haffman树,然后在树的边上标01来给字符编码,再把string中的字符换成2进制码

example:abcdaab,a出现3次,b2次,cd各1次,于是:

a:0,b:10,c:110,d:111,字符串:0101101110010


java的string:==操作符是比较地址

执行速度:StringBuilder > StringBuffer > String ;

StringBuilder:线程非安全的;

StringBuffer:线程安全的;

用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收

用new生成字符串(String s = new String("abc");)是在栈区,如果是常量字符串(String s = "abc";)则在全局变量区


KMP算法(模式匹配):长为m的字符串(模式串)中匹配长度为n的主串(目标串),时间复杂度为O(m+n)

          a  a  a  b

序号   1  2  3  4

next   0  1  2  3

位移   1  1  1  1

匹配不成功时的位移为序号减去next值,next值:序号1、2的为0、1,

后面的第i个字符则是看前面从第一个字符开始的子串和到第i-1个字符结束的子串集中是否有能匹配上的,并找出其中具有最大长度的,

比如第3个字符,子串1-1(a)和子串2-2(a)可以匹配上。第4个字符,子串1-1(a)和子串3-3(a)可以匹配上


广义表:元素可为数据或子表(可为空表),head操作:取头元素或表,tail操作:取头元素外的元素组成的表

表尾是指除去表头后剩下的元素组成的表,表头可以为表或单元素值


链表有无环:

快慢指针法:两个指针,一快一慢,看两个指针是否遇上。


链表相交:两表相交,则有某一节点为两者共有,那么从此节点到尾结点都共有

hash法:时间复杂度O(m+n),空间复杂度O(m)

无环链表:对齐尾部,然后从同一位置(相对于尾部)开始,看是否有相同的


二叉链表: 

左孩子右兄弟


静态链表:用数组实现链表,即每个元素记录一个前驱或后驱的index


中缀表达式转换成后缀表达式:可以用二叉树也可以用栈

转换过程需要用到栈,具体过程如下:1)如果遇到操作数,我们就直接将其输出。2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。


汉诺塔:

假设有n片,移动次数是f(n)。显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1


循环队列:

循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。解决这个问题的方法至少有两种:

① 另设一布尔变量以区别队列的空和满;

②另一种方式就是少用一个元素空间,约定队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。


hash表:

哈希表的装填因子定义为:α=(表中填入的记录数)/(哈希表的长度)

处理冲突:

1、开放定址法

用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的地址则表明表中无待查的关键字,即查找失败。 

按照形成探查序列的方法不同,可将开放定址法区分为线性探查法、线性补偿探测法、随机探测等。

(1)线性探查法(Linear Probing)

该方法的基本思想是:将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:d,d+l,d+2,…,m-1,0,1,…,d-1

即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。

用线性探测法处理冲突,思路清晰,算法简单,但存在下列缺点:

① 处理溢出需另编程序。一般可另外设立一个溢出表,专门用来存放上述哈希表中放不下的记录。此溢出表最简单的结构是顺序表,查找方法可用顺序查找。

② 按上述算法建立起来的哈希表,删除工作非常困难。假如要从哈希表 HT 中删除一个记录,按理应将这个记录所在位置置为空,但我们不能这样做,而只能标上已被删除的标记,否则,将会影响以后的查找。

③ 线性探测法很容易产生堆聚现象。所谓堆聚现象,就是存入哈希表的记录在表中连成一片。按照线性探测法处理冲突,如果生成哈希地址的连续序列愈长 ( 即不同关键字值的哈希地址相邻在一起愈长 ) ,则当新的记录加入该表时,与这个序列发生冲突的可能性愈大。因此,哈希地址的较长连续序列比较短连续序列生长得快,这就意味着,一旦出现堆聚 ( 伴随着冲突 ) ,就将引起进一步的堆聚。

(2)线性补偿探测法

线性补偿探测法的基本思想是:将线性探测的步长从 1 改为 Q ,即将上述算法中的 j = (j + 1) % m 改为: j = (j + Q) % m ,而且要求 Q 与 m 是互质的,以便能探测到哈希表中的所有单元。

(3)随机探测

随机探测的基本思想是:将线性探测的步长从常数改为随机数,即令: j = (j + RN) % m ,其中 RN 是一个随机数。在实际程序中应预先用随机数发生器产生一个随机序列,将此序列作为依次探测的步长。这样就能使不同的关键字具有不同的探测次序,从而可以避 免或减少堆聚。基于与线性探测法相同的理由,在线性补偿探测法和随机探测法中,删除一个记录后也要打上删除标记。

2、再哈希法

这种方法是同时构造多个不同的哈希函数:    Hi=RH1(key)  i=1,2,…,k当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

3、链地址法

这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。


一、静态查找表

1.顺序表查找顺序查找(Sequential Search)又称为线性查找,是一种最简单的查找方法。查找过程如下:从线性表的一端开始顺序扫描线性表,依次将扫描到的结点关键字和给定值进行比较。若当前扫描到的结点关键字与给定值相等,则查找成功;若扫描结束后,仍未能找到关键字等于给定值的结点,则查找失败。

2.有序表查找(折半查找)当静态查找表为有序表示,那么可以使用折半查找算法来查找,折半查找(Binary Search)的查找过程如下:先确定待查记录所在的范围(区间),然后逐步缩小范围 知道找到或找不到该记录为止。它对线性表的要求是:关键字值按递增或递减顺序排列。首先,将要查找的关键字k与中间位置结点的关键字比较,中间结点把线性表分为了两个子表,若比较结果相等,则查找结束。若不相等,再根据关键字与该中间结点关键字的 比较结果确定下一步在哪个子表区间内查找。这样递归进行下去。直到找到满足条件的结点或该线性表中没有这样的结点。

3. 索引顺序表查找索引顺序查找,又称分块查找。是顺序查找的一种改进。其性能介于顺序查找和折半查找之间。分块查找把线性表分成若干块,每一块中的元素存储顺序是任意的,但是块与块之间必须是按关键字大小排序(即前一块中的最大关键字大于(或小于)后一块中的最小(或最大)关键字值)。另外,需要建立一个索引表,索引表中的一项对应线性表中的一项,索引项由关键字域和链域组成,关键字域存放相应块的最大关键字,链域存放指向本块第一个结点的指针,链域存放指向本块第一个结点的指针,索引表按关键字值递增(或递减)顺序排列。索引表查找算法:实际上进行了两次查找(折半查找+顺序查找)。因此整个算法的平均查找长度是两次查找的平均查找长度之和。

静态与动态区别:动态查找表在查找过程中插入元素或者从查找表中删除元素静态查找表只是查找特定元素或者检索特定元素的属性最通俗的解释:动态查找表可以对查找表结构进行修改,而静态查找表只是查询






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值