排序复杂度:O(N²),O(N*logN),O(N)
查找负责度:O(N),O(logN),O(1)
其中排序复杂度为N²的为直接排序,选择排序,希尔排序
NlogN的为归并排序,快速排序和堆排序
N的一般是做hash或者通过bitmap,布隆过滤器等。
如果考虑到提高排序效率,则提高到log级别时,要考虑二分法排序;提高到O(N)级别则考虑bitmap或者hash了。
但是使用hash要注意hash冲突,冲突过大时则也有复杂度升高的风险。
查找:无序序列为O(N),有序序列为logN(二分查找),最极端的为hash查找或者bitmap查找,则是O(1)级别。
插入删除元素一般来讲和查找是对偶的
例如数组查找方便O(N)或者O(logN),但是增删则为O(N)复杂度
链表增删都为O(1)复杂度(当直接找到改点时),查找则为O(N)。
如果查找和增删要求同步提高且数据集没有强关系,则可以考虑红黑树。
红黑树的增删查的复杂度都是O(logN)。
另外还有就是充分应用“空间换时间”的手段
1:如BYTE数据中1 的个数,直接申请255个数据存放0~255中1的个数
2:如计算N数组中任意N-1乘积的最大值,文中很巧妙的利用了两个数组分别表示前i-1个数组的成绩和后N-i个数据的成绩。
一次扫描完成之后,这两个数组填满。再遍历一次,则可以依次计算出“分别去除当前第i个数据后的N-1个数据的乘积”,最后比较即可。
此时的复杂度为O(N)。至于后面的根据乘积和0比较则属于数据本身分析,个人觉得不算算法范畴提高。
最后就是关于DP,动态规划方面的。
这块还在学习中。。