1、数组的数据项查找方法有两种:线性查找和二分查找。
2、有序数组可以使用二分查找快速查找数据项。
3、java中有两种数据类型:基本类型和对象类型。
有序数组的优点:查找比起无序数组要快的很多,缺点是,插入的时候,靠后面的数据项都要向后移以腾出空间,所以速度相对来说是比较慢的,但是不管是有序数组还是无序数组删除都比较慢,因为删除的时候,后面的数据项都需要向前移动来填充空位。
数组的缺点:数组的删除效率比较低,在无序数组中搜索是低效的,而在有序数组中插入效率有很低,而且数组在new的时候就必须固定大小,在开发的时候很多时候数据项我们是没办法预知的,数组创建大了浪费空间,创建小了就会造成溢出。
2、数组二分查找
2.1、根据比较次数求出可比较的数值范围:
公式:R=2S
R表示范围,S代表比较的次数,比如在二分查找中比较了10次,那么最高可查找的范围时多少个数据项呢?
例子:在二分查找中比较10次最高可查找多少个数据项? 210 =1024个数据项
2.2、根据数据项的项数,求出二分查找最多要比较的次数:
公式:S=log2(R) S代表比较次数,R代表范围 (以2为底的范围的对数)
例子:数组中有5000个数据项,使用二分查找最多需要比较多少次找到?
Log2(5000)=12.28 四舍五入等于12
以上是这么求出来的呢?绝大部分计算器都有log功能,但是基本上都是以10为底数来求对数,但是通过将结果乘以3.322就可以轻松的换成以2为底数的对数了。例如Log10(5000)=3.69867.... 3.69897X3.322=12.28
2.3、求二分查找需要的时间
公式:T=K*log2(N)
3.0、大O表示法
大O表示法即是:粗略的度量方法。例如汽车按照尺寸可分为小型、中型、大型等,也就是在不提及具体尺寸的情况下,提供一个大致的概念。这种粗略的度量方法被称为“大O表示法”。
3.1、无序数组的插入:常量
无序数组的插入效率和数据项无关,因为新的数据项总是放在下一个有空的地方。不管数据项的个数N有多大,每一次插入所用的时间都是相同的,所以无序数组插入一个数据项的时间T是一个常量K, (K包含了处理器的效率和编译程序生成程序代码的效率等等因素所花费的时间)T=K
3.2、线性查找:与N成正比
- 线性查找需要比较的次数为:S=N/2
- 搜索N个数据项所需的时间为:T=K*N/2
- T表示搜索需要的时间,K为一个常量,查找每一个数据项所需的时间,包含了处理器效率和编译器的效率,N/2即比较次数
插入N个数据项需要的时间:T=K*N
3.3、大O表示法中,不需要常量
使用大O表示法去比较算法并不需要在乎具体的细微的东西,比如说处理芯片和编译器,真正需要比较的是数对应不同的N值,T是如何变化的,而不是具体的数组,所以不需要常量
用大O表示法表示运行时间:
线性查找 O(N)
二分查找 O(logN)
无序数组插入 O(1) 常量级时间
有序数组插入 O(N)
无序数组删除和有序数组删除 O(N)
O(1) 优秀 O(logN) 良好 O(N) 还可以 O(N2)差