首页 > 代码库 > 数据结构
数据结构
一、链表
头结点:知道链表第一个元素的位置,就知道链表的位置,故在插入元素函数的参数用指针的指针**phead,这样空链表时*phead=newnode,否则需要消耗一个空节点的空间(参数*headnode,在头插入是headnode->next=new)。如果参数为*phead,空链表时phead=&newnode,函数返回时phead仍然为空[剑指offer p50]。故要改变值,传指针,函数中用*point改变值-->改变指针指向的内容(改变指针的值)-->传指针的指针。
单链表的特特性-知道ai就知道其后继,但不知道其前驱,故对ai的操作要找ai-1
二、字符串精确匹配算法KMP、BM
相比朴素算法,快在不需要回溯(回溯指下一轮匹配指针回退到上一轮比较过的字符开始)
1.不用回溯的原理:
匹配失败时,如果目标串成功匹配的部分没有重复时,那移动一位或者几位后,是不可能匹配成功的,所以下次从源字符串的开头与目标串比较。而如果成功匹配的部分有重复时,移动目标串使重复的的部分对齐,比较剩余没有对齐的部分。这样就避免了回溯,目标串的特点来进行下一次最有效的匹配。
2.BM比KMP高效:
KMP从左往右匹配,从匹配的子串找重复的部分对齐,移动的距离短。BM从右向左匹配,从未比较的部分中找匹配的子串,移动的距离大(如果目标串非重复性(如abdabab),很难匹配,移动目标串长度的距离)
BM的特性:(坏字符)排除法,当前字符未匹配,若目标串左边也没有与当前字符匹配的字符,就不可能匹配了。这样可以跳过整个目标串长度的距离。
3.对齐方式:
KMP:从左往右比较,故将从前往后的前缀(如果不是从开头的前缀,说明在找到的重复子串前有跟未匹配的后缀有不匹配的,那对齐了也不匹配,如cbabexxxx与cbabd)与未匹配处前的后缀对齐
BM:从右向左比较,故将已匹配过的后缀与目标串中从后往前最近的一个相同的子串对齐。(如果是从前往后最远的一个相同的子串对齐,移动的距离更大,有可能会错过源串中匹配的位置)
4.BM算法:
BM本身从右向左匹配的特性(使已匹配部分对未匹配部分做贡献),利用“好后缀”与“坏字符”两者移动的最长距离做移动的距离,经常会出现移动目标串长度的距离,那么源串中很多字符没有经过比较(被排除了)。
特殊的,好后缀与坏字符都有事,按照两者移动的最长距离做移动的距离对齐后,可能出现无效的匹配:好后缀ab,坏字符c,源xxxcabxxx,目标cdabeab,按坏字符对齐,c后的da肯定不能匹配;若目标dabceab,按好后缀,ab前面的d肯定不匹配。故可改进若好后缀与坏字符同时出现,保证‘坏字符好字符‘或‘空好字符‘。如xcabxxxeab或abxxcxxeab。即无坏字符,跳过。有坏字符,若无好后缀,按坏字符对齐;若有好后缀,按坏字符对齐时,坏字符后紧跟好后缀;按好后缀对齐,前是坏字符或空
5.性能退化:
若每轮中模式串与目标串之间的不匹配都发生在模式串的第一个字符处,则KMP和BM算法会退化为朴素模式匹配算法。
KMP:仅当模式串与目标串之间存在许多“部分匹配”情况下,KMP算法才比朴素模式匹配算法更具优势。
三、排序
快排每扫一次,将数据按某一值分成了两边,至少有右边的数据都大于左边的数据,所以,下一次左右两边被分开的数据就不用比较了。相同的,推排序,在构建堆时,已经利用根节点,将左右子树的数据分开,排序时,只调整一个分支的根和子节点,跟节点左右子树也不用比较了。相反,插入、简单选择、冒泡每扫描一次,只得出一个最大(小值),再没有其它的结果信息能给下一次排序带来贡献。所以,当待排序列基本有序时,快排每一次都只分为一个序列,没有对下一次排序带来贡献,退化为O(n2)
四、海量数据-外排
1.bitmap:利用每个bit位存储一个数据,节省了存储空间,若可将海量数据一次全部载入内存,减少了IO。同时,在内存中一次设置bit,一次遍历统计bit,复杂度为O(n)。
考虑--因为需要一次全部载入内存,所以需要考虑占用内存情况:
数据范围->需要的内存空间:如4B的整数,可表示的范围为232个,需要的空间为232/23B=512MB。
适用:查找,判重(1.读取到bit位为1数据,即已经出现过的,记录在变量中或2.标记在bitmap中,不过一个数要占用2bit),排序
实现:bit位数组
2.bloom-filter
在bit-map占用内存空间不足时使用。
http://www.cnblogs.com/dolphin0520/archive/2011/10/19/2217369.html
http://www.cnblogs.com/dolphin0520/archive/2012/11/10/2755089.html
http://blog.csdn.net/v_JULY_v/article/details/6712171
http://www.cnblogs.com/bigrabbit/archive/2012/08/26/2657495.html
数据结构