感觉快要秋招了,学的东西还是学完就忘,太难受了...
感觉东西不能信手拈来,还是差点意思,例如数据结构或者STL容器这种。
不如从头学起,学就完了!
时间复杂度和空间复杂度,用来度量代码效率。
我们编程就是产生应用的过程,为了解决问题,但是也要更好的、更优的去解决。
围绕复杂度展开的问题:算法/数据结构的选择、代码效率提升、降低时空间复杂度。
时间复杂度指的是:程序运行时代码执行次数。
计算复杂度:看循环的层数,以及变量的增幅,循环变化和终点。
复杂度性质:
- 复杂度与具体的常系数无关
- 多项式级复杂度相加,把高次作为结果
- O(1)的含义是,某个任务通过有限可数的资源即可完成,与输入的数据量n无关
其他结论:
- 一个顺序结构的代码O(1),就是即使是1000行那也是O(1)。
- 采用分治法的二分策略,O(logn)。
- 一个简单的循环O(n)。
- 两个顺序执行的循环:取最高项。
- 两个嵌套循环:O(n2)。
可以用空间换时间,空间廉价,时间宝贵。要快!
数据结构可以按照逻辑结构分类:
主要是一对一、一对多、多对多。
集合没逻辑,一对一的是线性结构,例如一维数组、栈、队列等,而一对多或多对多就是例如树和图,就属于是非线性结构。
当然也可以按照存储结构分类,例如顺序、链式、索引、散列。
- 顺序就类似数组,空间连续。
- 链式就是链表,地址不连续,通过指针使其相连。
- 索引可以理解为目录,索引底层数据结构是B+树。B+树的优点是层数少,可以快速查找。缺点是插入速度慢。
- 散列英文hash,不连续存储,但是可以迅速找到,可以联想哈希表。
这两种分类并不是冲突,例如以数组存储的栈结构,那么它就是顺序存储的线性结构,我直接top指针加减就做到了入栈出栈。但是栈算是受限的结构。
双向链表满足一对一,是线性结构,可以理解为:天生的就是单项链表,你的前后都定了,后天给你加上的反向,故,你还是一个一对一结构。
数据结构主要是研究:增删查。
小tips:
^的优先级低于+-号,并且表示异或,而并不是次方。
可以通过异或来实现无需中间值的两者交换。
并且,并不是长得奇怪的符号优先级就高...
学!为什么不学!