数据结构--哈希

列表中有 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

  1. HashMap,TreeMap 未进行同步考虑,是线程不安全的。
  2. HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
  3. Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
    List list = Collections.synchronizedList(new ArrayList());
    Set set = Collections.synchronizedSet(new HashSet());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值