-
1. 数组与字符串
- 提到了散列表(哈希表)和动态数组,做题时可能要想到用散列表。
- 字符串使用哈希表可以采用一个256字节的数组来实现,因为ASCII只有0~256。
- 双指针要会用,好用。
- 数组和字符串,由于在中间删除插入等会导致后面的都变动,所以最好能从尾部开始调整。
-
1. 链表
- 链表在做题时搞清楚是单向链表、还是双向链表、还是循环链表等。
- 链表的访问用时不定,不是O(1)所以比较麻烦,而且有时会用到递归。
- 删除、插入等操作时,一定要记得判断是否为链表头或者尾!这部分的操作会不同。
- 快慢指针是链表操作的一个小技巧,做题时记得考虑。
- 解不出时不妨试试递归。
- 快慢指针找出环路的算法可以再复习一下,很巧妙!
-
4. 树与图
- 二者是非线性的数据结构,在一些算法中,最好情况和最坏情况可能会有较大差距,注意这点。
- 二叉树的题目中,要注意是不是一些特殊的树结构,对特殊的树结构要了如指掌,比如二叉搜索树、二叉平衡树,对高阶的红黑树、B树、B+树、trie树(单词查找树)等也要有所了解。
- 树的遍历:前中后序遍历,递归很好写,迭代不太会写,可以学学。BFS的层次遍历写过多次了。
- 图的遍历:DFS和BFS两种。DFS主要以递归实现,注意要对访问过的节点标记。BFS主要以队列的形式。一般BFS利于解决最短路径的问题!
- 二叉搜索树有个地方比较模糊:书上说左子树小于等于,右子树大于;百度百科说左子树小于等于,右子树大于等于。这个要确定好。某些地方可能会出问题。
-
10.拓展性与存储限制
-
循序渐进:
- 首先假设如果一台计算机中能够装下所有,那么你如何解决?这个思路会为之后提供帮助。
- 接着考虑如何合理拆分数据?计算机从哪里去读取?
- 最后,针对步骤二中的问题给出解决办法,可能在解决时又会出现新的问题,那么需要一步步解决。有可能用步骤一中的方法进行改进,也可能推翻重新找到巧妙的方法。
-
在考虑这样的问题的之前,最好了解计算机一般的存储容量、内存大小、网络延迟是多少。
-
拆分数据:
- 按照顺序:一台机器塞满了,塞进下一台机器;
- 按照散列表:以散列表将数据分布至多台机器,但可能负载不均匀;
- 按数据实际值:比如社交系统,中国的放在一起,墨西哥的放在一起,这样在这种场合下,访问效率较高;
- 随机: 随机放在不同机器,虽然均衡了,但是查找表肯定会巨大。
-
考虑使用散列表来解决问题。
-
内存不够用时,考虑将每个字节拆分成8个bit,有些情况就够用了。
-
例1:40亿个非负整数,找出一个没出现过的,内存有1GB(拓展1MB 内存)。
- 1GB是10亿字节,如果拆为bit,则为80亿bit,40亿个数够放下了。所以拿出前40亿bit,如果出现了置1。然后找到一个为0的即可。
- 1MB是100万字节,上面的方法肯定是不行的。这时则要思考了。100万字节最多表示800万的数,我们拿出100万用。我们只要找到某100万区间内,哪个区间的数不够100万个,然后再用上面的方法即可找到这个区间内没有的数字。
- 40亿共有4000个100万,第一遍循环,统计4000个区间内的数字数目,找到不够100万的。然后再这个区间内找。
-
例2:给100亿个网站URL,找出其中重复的URL。
- 首先,假设一个网站100字符,一个字符4字节。400字节,那么100亿就是4TB的总量。内存肯定放不下。
- 但首先假设能放下,我们怎么找出重复的呢?遍历,建立哈希表,找出重复的。
- 那么我们需要将数据分散,那么以什么方式呢?顺序、哈希、随机?都可以。我们将4TB分为4000份,放在硬盘中,每份1GB,然后对这1GB进行查找重复值。
-