哈希表的一个题目(来自算法艺术)

 题目大概意思:

一个箱子,分N天往里面放账单,每天取其中最大和最小值,计算两者之差,并从箱子中去掉,其它的留着到下一天,要求N天中每天那个差值。相关条件:N<=5000,第i天放入a[i]张,a[i]<=100000,a[i]加起来小于1000000。第i天放入账单的面值分别为b[1],b[2],..b[j[,b[j]<=1000000

问题解答方法1: 二叉堆,最大最小堆,相互引用,维护很麻烦,而且时间复杂度为O((N+s)logs)。解决办法是每天只保留最大的N个元素和最小的N个元素,其它都舍弃。这样将时间复杂度降为O((N+s)logN),空间复杂度降为O(N)。

问题解答方法2:哈希表。建立一个大小M为1000000的哈希表H,每个元素表示面值等于对应下标的账单的放入次数。遍历哈希表可以知道当天最大和最小的账单,这样复杂度为1000000。因此我们需要采用分段哈希的方法,建立一个L的一级哈希表H1(L=M1/2,即使L+M/L取最小值的L),每个元素对应H中的一段元素,H1中下标为i的元素对应H中[i*M/L,(i+1)*M/L)。这样每次取最大最小值的时候先遍历H1,找到H中对应的段,然后遍历H中该段元素。H1中每个元素中的计数器属性表示该段中元素出现的次数,H中每个元素的计数器表示该元素总共出现的次数。这样,算法复杂度称为O(NL+s)。

该道题目关键是建立哈希表和分段哈希的思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值