在计算机内存组织中,只有两种数据存储的基本方式:数组和链表。
<1>数组管理
int a[100];
//就是在内存中申请100个连续的sizeof(int)空间。
int *p = malloc(100*sizeof(int));
//在堆中申请100个连续的int空间。
要对空间进行访问:得到第10个成员。a[10],o(1)的成员访问时间。
例如:100个空间是无序的,查找某一个数,必须遍历,从0......99.
如果在这100个空间中插入/删除一个数组,需要将后面的所有成员后移/前移。
a、访问 时间复杂度:o[1]
a[10]=>*(a+10)
b、删除/添加 不现实
<2> 数组应用
最大的应用,查找表:基本不会添加/删除成员,可以一次性访问某个成员,借助数组下标的优越性.
具体应用:要得到0~127这些范围中某个数的二进制码中,从最低位开始,第一次出现1的bit位编号.例如:
3____>>0000 0011 得到的值位bit0
4____>>0000 0100 得到的值位bit2
一个比较简单的方法:
data&0x01 =1,已经找到这个bit位编号
否则:data >>1,循环检测
虽最多比较7次,但仍没有办法绝对的固定得到这个值的具体时间,可以构建一个表:
a[128]={-1,0,1,0,2,0,1,0,3....}
0,1,2,3,4,5,6,7,8
ret=a[n]
能在确定的时间内得到期望的结果.
缺点:事先构建表,占用内存空间.