目录
- 知识框架
- No.0 时空权衡
- 一、基本思想
- No.1 计数排序
- 二、分布计数
- No.2 散列法
知识框架
No.0 时空权衡
一、基本思想
其实时空权衡:是指在算法的设计中,对算法的时间和空间作出权衡。
本文主要是是用空间来换时间的。(应该是这样吧)
- 对问题的部分或全部输入做预处理,然后对获得的额外信息进行存储,以加速后面问题的求解——输入增强。
- 使用额外空间来实现更快和(或)更方便的数据存取——预构造。(感觉像是存放脑信息)
以常见的以空间换取时间的方法有:主要是两个方法:然后代表。
- 输入增强
- 计数排序
- 预构造
- 散列法
那面是计数排序和散列法的详细介绍:
No.1 计数排序
针对待排序列表中的每个元素,算出列表中小于该元素的元素个数,并把结果记录在一张表中。
- 这个“个数”指出了元素在有序列表中的位置
- 可以用这个信息对列表的元素排序,这个算法称为“比较计数”
步骤:思路:针对待排序列表中的每一个元素,算出列表中小于该元素的元素个数,把结果记录在一张表中。
代码如下:
{ //用比较计数法对数组排序
for(i=0;i < n;i++) Count[i]=0;
for(i=0;i < n-1;i++)
for(j=i+1;j < n; j++)
if(A[i]<A[j]) Count[j]++;
else Count[i]++;
for(i=0;i < n;i++) S[Count[i]] = A[i];
return S;
}
复杂度效率问题:
- 该算法执行的键值比较次数和选择排序一样多,
- 并且还占用了线性数量的额外空间,所以几乎不能来做实际的应用
- 但在一种情况下还是卓有成效的——待排序的元素值来自一个已知的小集合
1.
二、分布计数
待排序的数组元素有一些其他信息和键值相关(不能改写列表的元素)
因为这种频率的累积和在统计中称为分布,这个方法也称为“分布计数”。
- 将A数组元素复制到一个新数组S[0…n-1]中
- A中元素的值如果等于最小的值L,就被复制到S的前F[0]个元素中,即位置0到F[0]-1中
- 值等于L+1的元素被复制到位置F[0]至(F[0]+F[1])-1,以此类推。
步骤:
-
比如数据是: 13 11 12 13 12 12
-
首先需要整理表格内容:
-
数组值 11 12 13 频率 1 3 2 分布值 1 4 6
-
-
得到这样的内容
代码:
{ //分布计数法对有限范围整数的数组排序
for(j=0;j <= u-L ;++i) D[j]=0;//初始化频率数组
for(i=0;i < n; ++i) D[A[i]-L]++;//计算频率值
for(j=1;j <= u-L ; ++j) D[j]+=D[j-1];//重用分布
for(i=n-1;i>=0;--i){
j = A[i] – L ;
S[D[j]-1] = A[i];
D[j]--;
}
return S;
}
No.2 散列法
- 一种非常高效的实现字典的方法
- 字典是一种抽象数据类型,即一个在其元素上定义了查找、插入和删除操作的元素集合
- 集合的元素可以是容易类型的,一般为记录
- 散列法的基本思想是:把键分布在一个称为散列表的一维数组H[0…m-1]中。
- 可以通过对每个键计算某些被称为“散列函数”的预定义函数h的值,来完成这种发布
- 该函数为每个键指定一个称为“散列地址”的位于0到m-1之间的整数
. 集合的元素可以是容易类型的,一般为记录
2. 散列法的基本思想是:把键分布在一个称为散列表的一维数组H[0…m-1]中。
- 可以通过对每个键计算某些被称为“散列函数”的预定义函数h的值,来完成这种发布
- 该函数为每个键指定一个称为“散列地址”的位于0到m-1之间的整数