Co2y's Blog

算法&数据结构小结

最近开始找暑期实习了,刷了一些算法题。下面做个汇总和小结。

数据结构

数据在内存中要么根据偏移得到(数组),要么是地址跳转(链表,树)

数组

中间修改是O(n),动态数组可以O(1)追加元素,但是开销主要在扩容的时候。有序数组可以两指针夹逼

链表

根据index查找O(n),快慢指针的方法

树的遍历方式,二叉搜索树,二叉平衡树(AVL,红黑树),多路平衡树(B+,R)。 求最小生成树的方法

队列,双端队列

队列可以由两个栈实现,反之亦然。python队列可以用deque

可以由list简单实现,但是用栈解的题目还是不容易直接看出来,可以先列举几个简单情况观察一下。

最小堆,最大堆

平衡插入和查找的时间开销,都是O(nlogn)

哈希表,集合

基于hash表的set比map/dict更省内存,set也可以用树来实现做到有序,但是从O(1)变成O(logn)。

图很少遇到,求最短路径,二分图匹配,拓扑,并查集,网络流。

复杂数据结构

B+树,R树,KD树,线段树

算法

分治

快排,归并都是DC,DC通常是递归的去解决两边的问题,有时候也需要和中间的一并考虑

贪心

例如根据起止点排序的一类问题

搜索

DFS通常是递归,回溯,栈; BFS通常是循环,队列。搜索很常用,另外还有双向的BFS,A*等

排序

主要是快排,归并排序,桶排序。另外用位图排序可以很好解决内存占用的问题

查找

二分搜索

动态规划

子问题以及不对之后产生影响,例如背包问题。动态规划通常也不容易看出来,有一维的,二维的,还有枚举所有可能的。

其它

字符串算法(子串匹配kmp, 回文串m);数学,包括几何,概率,博弈,随机,近似

小结

并没有系统的练习过。。随着做题不断补充。。

  1. 括号匹配(栈),表达式求值(中缀转后缀,栈)
  2. 排列,组合(dfs,逆序数,next permutation)
  3. 回文子串(dp)
  4. 蓄水问题(左右扫描)
  5. 链表(dummy 头结点)
  6. 前后夹逼要优于one pass(一遍扫描)
  7. 英文字典(字典树)
  8. 区间求和(树状数组,线段树)
  9. 滑动窗口(deque,双端队列)
  10. 强盗抢劫和买卖商品(贪心)