大O表示法
程序的算法有好有坏,而运行时间和空间占有率是关键。
一般使用大O表示法讨论运行时间,它指出了最糟糕情况下的运行时间。
- 算法的速度指的并非是时间,而是操作数的增速;
- 讨论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加;
- 算法的运行时间用大O表示法表示;
- O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快的越多
数组与链表
使用数组意味着数据在内存中都是相连的(紧靠在一起),就像朋友聚餐,找到地方后又来了一个朋友,但原来的地方没有空位置,只得再找一个可以坐下所有人的地方,但是如果又来了一个朋友,而之前的地方也没有空位置,那么又得再次转移,太麻烦!而且内存转移很是耗时。一种解决之道是“预留位置”,提前找个有10个位置的地方,即向计算机申请10个内存大小空间,但是存在以下缺点:
- 额外请求的位置可能用不上,这将浪费内存,你没有使用,别人也用不了
- 人数超过10个后,你还得转移
这种问题,可使用链表解决
链表
链表的每个元素都存储了下一个元素的地址,从而时一系列随机的内存地址串联在一起。聚餐时一起坐不下,那么就分开坐。
链表中添加元素也很容易,只需将其放入内存,并将其地址存储到前一个元素中。
但是链表也有其缺点:不能直接读取链表中的元素,因为你不知道它所在的地址,必须访问元素#1,从中获取元素#2的地址,在访问元素#2并从中获取元素#3的地址,依次类推。如果同时读取所有的元素时,链表的效率很高。链表是顺序访问的。
优势在于插入、删除
数组
数组与链表不同,我们是知道每个元素的地址的,因为它们的地址是相连的,那么只需要执行简单的数学运算就可以了。例如数组中第一个元素的地址为00,那么第5个元素的地址就是04。数组是随机访问的。
优势在于查找、随机访问