3.1.0用例举例:
1.一个用来跟踪算法在小规模的输入下的行为测试用例:
类似hashMap,输入的相同的key,新值会代替旧值.例如:使用”S E A R C H E X A M P L E ” 按照约定,我们将S→0 R→3 ,但是E→ 12 (不是1 或者6 因为最后的E值已经更新为12),最后按顺序输出字母以及对应的值.
2.一个用来寻找更高效的实现性能测试用例.
记录一系列的输入字符串,并记录出现的次数,然后遍历所有键找出出现频率最高的键.
3.1.1符号表所需要具备的共性:
1.混合使用查找和插入的操作
2.大量不同的键
3.查找操作比插入操作多得多
4.虽然不可预测,但是查找和插入的操作使用模式并不是随机
3.1.2无序链表中的顺序查找,(基于链表)
image.png命题A:
在含有N对键值的无需链表中,未命中的查找和插入都需要N次比较,命中的查找在最坏情况下也需要N次比较.向一个空表中插入N个键值对需要n(n-1)/2 ( ~N^2/2) 次比较.
推论:
向一个空表中插入N个不同的键需要~N^2/2次比较.
这些分析证明,基于链表的存储和查找的效率是非常低的,无法满足FrequencyCounter的处理庞大的输入问题需求.
3.1.3 有序数组的二分查找
对二分查找的分析:
命题B:
在N个键有序的数组中进行二分法查找,最多需要lgN+1次比较,无论成功失败.
尽管二分法查找时间是对数级别,但是put方法还是太慢了,需要单次插入一个键时间复杂度需要N,向一个空符号表中插入2N(小于需要插到前面,还需要比较和后一个键的大小 所以需要比较2次 N个需要x2)个键最坏情况下需要访问N2次数组.所以还是不能使用在数据庞大的操作.
一般情况下二分查找比顺序查找要快的多,他也是在众多实际应用中使用的最佳选择.
网友评论