散列表的基本思想是将关键字(key)通过散列函数映射到表中的一个位置,在查找的时候只要通过关键字就可以直接获取对应位置的值。那么主要的问题就是如何设计散列函数和如何在不同的关键字映射到同一位置的时候处理冲突。注意我们现在讨论的存放的仅仅是关键字,实际情况存放的是关键字+值。
一个liunx命令题目引发的对shell的回顾
原题回顾:打印当前文件夹下所有的.txt文件的最后一行到新文件newFile.txt中
其答案最后解答如下
伸展树(splay tree)
什么是伸展树?
首先,伸展树(splay tree)是一颗二叉搜索树,它的定义是建立在二叉搜索树之上,并且它是基于类似程序局部性原理的假设:一个节点在一次被访问后,这个节点很可能不久再次被访问。那么伸展树的做法就是在每次一个节点被访问后,我们就把它推到树根的位置。正像程序局部性原理的实际效率被广泛证明一样,伸展树在实际的搜索效率上也是非常高效的。尽管存在最坏情况下单次操作会花费O(N)的时间,但是这种情况并不是经常发生,而实际证明伸展树能够保证M次连续操作最多花费O(MlogN)的时间。
相比于平衡二叉树,伸展树有差不多的平均性能,其他的优势在于:不需要存储平衡信息。另外如果采用自顶向下的调整方式,还能简略额外的栈开销。
栈和队列
ArrayList和LinkedList的实现方式
ArrayList的底层实现是可以增长的数组,LinkedList的底层是使用了双链表。从底层实现来看,我们可以知道,ArrayList 获取元素的时间复杂度仅为常数,而 插入和 删除的时间复杂度都为线性时间复杂度O(n)。而LinkedList则刚好相反,因为底层是链表,所以 插入和 删除的时间复杂度为常数,而 获取元素的时间复杂度却是线性时间复杂度。
另外,ArrayList和LinkedList的contains和remove方法的时间复杂度都为线性时间复杂度O(n),对于contains方法来说,ArrayList和linkedList都需要遍历操作来实现contains方法,所以时间复杂度都是线性的;对于remove操作,ArrayList删除后需要移动元素,所以时间复杂度是线性的,而LinkedList的remove操作虽然是常数时间的,但是查找到元素的时间复杂度是线性的,所以,对已LinkedList的remove操作来说也是线性时间复杂的。
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info.
If you get any problems when using Hexo, you can find the answer in troubleshooting
or you can ask me on GitHub.