列表中有 n 个正整数范围在[0,1000],请编程对列表中的数据进行排序
第十一章 18题
// An highlighted block
def quick_sort(alist,start,end):
if start >= end:
return
mid = alist[start]
low =start
high = end
while low < high:
while low < high and alist[high]>=mid:
high -= 1
alist[low] = alist[high]
while low < high and alist[low]< mid:
low += 1
alist[high]=alist[low]
alist[low]=mid
quick_sort(alist,start,low-1)
quick_sort(alist,low+1,end)
return alist
alist = [0,999,99,2,1000]
print(quick_sort(alist,0,len(alist)-1))
----2020/4/23
----散列技术中的冲突是指( )。
正确答案: D
两个元素具有相同的序号
两个元素的键值不同,而其他属性相同
数据元素过多
不同键值的元素对应于相同的存储地址
解析:对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为碰撞
----散列函数有共同的性质,则函数值应当以( )概率取其值域的每一个值。
正确答案: D
最大
最小
平均
同等
解析:散列的基本思想是以结点的关键码作为自变量,通过散列函数将其映射到记录的存储地址。
建立一个散列表之前需要解决两个主要问题:
⑴构造一个合适的哈希函数
H(key)的值同等均匀分布在哈希表中,提高地址计算的速度。
⑵冲突的处理
冲突:在散列表中,不同的关键字值对应到同一个存储位置的现象。即关键字K1≠K2,但 H(K1)=H(K2)。均匀同等的哈希函数可以减少冲突(不能避免冲突,发生冲突后,必须寻找下一个可用地址)。
----对于一个线性表既要求能够进行较快速地的插入和删除,又要求存储结构能反映数据之间的逻辑关系,则应该用()
正确答案: B
顺序存储方式
链式存储方式
散列存储方式
以上均可以
解析:要求能够进行较快速地的插入和删除,则可选范围为链式存储和散列存储,而再加上 要求存储结构能反映数据之间的逻辑关系,则只能选择链式存储了,因为散列技术的记录数据之间不存在什么逻辑关系,它只和关键字有关联。
----下述有关hash冲突时候的解决方法的说法,错误的有?
正确答案: B
通常有两类方法处理冲突:开放定址(Open Addressing)法和拉链(Chaining)法。
开放定址更适合于造表前无法确定表长的情况
在用拉链法构造的散列表中,删除结点的操作易于实现
拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间
解析:A:处理冲突方法:开放地址法和拉链法
B:拉链法的节点空间动态申请更适合无法确定表长的情况
C:想象其中有链表
D:规模较小,查找比较容易,用开放地址法能省空间
----下列关于线性表,二叉平衡树,哈希表存储数据的优劣描述错误的是?
正确答案: D
哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);
线性表实现相对比较简单
平衡二叉树的各项操作的时间复杂度为O(logn)
平衡二叉树的插入节点比较快
解析:平衡二叉树的插入操作,可能导致树不再平衡,需要旋转
----下面哪个不是用来解决哈希表冲突的开放地址法?
正确答案: C
线性探测法
线性补偿探测法
拉链探测法
随机探测法
解析:处理hash冲突有:开放定址法(线性探测法、线性补偿探测法、随机探测法),拉链法,建立公共溢出区,再散列法
----线程安全的map在JDK 1.5及其更高版本环境 有哪几种方法可以实现?
正确答案: C D
Map map = new HashMap()
Map map = new TreeMap()
Map map = new ConcurrentHashMap();
Map map = Collections.synchronizedMap(new HashMap());
解析:答案 : C D
- HashMap,TreeMap 未进行同步考虑,是线程不安全的。
- HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
- Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List list = Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(new HashSet());