时间不知不觉的流淌过去,第三天已结束,是时候来个第三天的小结了;
今天讲了数据结构和哈希(hash)算法,前者以前有过涉及,讲得稍微简单一点,哈希做较为重点的的分析;
frist.数据结构
1.链表,链接的数字(或其他),通过记录下一个单位的下标,将其连接,达到快速改变和寻找,是图的储存方法之一,可通过结构体或两个数组来实现,这里就不再深入了。
2.栈,一个先进后出的容器,类似于狭窄的胡同,只容一个数据进出,可以利用单调栈来解决一些有优先关系的题目,不再深入讨论。
3.队列,类似于栈,但是是一个先进先出的容器,可处理一些过独木桥的顺序问题和排队问题。会浪费大量内存可利用循环队列优化,还有单调队列也类似于单调栈,两头都可进出的双向队列,都不再加以讨论了。
4堆(重点讲解),堆是一个有序的完全二叉树,即儿子节点一定比父亲节点大或小,由此,可将堆分为大根堆小根堆。堆的优点在于O(1)时间复杂度的取最值效果,而且修改和初始化只要O(logn)和O(n long n)的时间复杂度,速度较快,所以堆可以次数较多最值查找。
取最值:最值=k[1];
修改:将修改值与同一父节点下的左孩子比较,若关系有变化,则再于父节点比较,进行交换,逐次向上比较直至堆的维护完成。
初始化:与修改操作相同,将第一个数视为一个堆,不断进行堆维护;
second.算法
在今天只有一种算法讲解:哈希(hash)算法。
这是一个比较玄学的操作,是将一些无法做为数组下标的数据特殊处理,使其可以使用。常用的方法有下面几种:
1.除留余数法(对于大数字):对其将"%"操作,返回值较小,但很有可能会有重复产生,所以要尽可能使用较大的素数。
2按权展开法(对字符串):将字符串看做是一个特殊进制数,计算值若过大利用除留余数法,再进行一次哈希。
因为除留余数法有一定可能重复,所以还要对重复数据进行操作,一般有以下常用方法:
1.线性探测开拓地址法:说简单点,从那个点一个一个往下找;
2.拉链法(常用):为哈希表每个位置创建一个链表,利用链表来扩充哈希表的存储量;
今天的内容结束希望有好的明天吧!