对n个数字进行排序,期中两两不同的数字的个数为k,n远远大于k,而n的取值区间长度超过了内存的大小,时间复杂度最小可以是?
A.O(nlogk)
B.O(nk)
C.O(n)
D.O(nlogn)
正确答案是 C
先通过hash来获得这k个数,以及每个数对应的个数,然后对k个数进行排序。复杂度为O(N),所以选择c
好文,喜欢看,比书上的好
我是前年在培训班学的平面设计,总的来说只能教你一些最基础的,真正有用的东西都是在实际工作中加上自身空闲时间的摸索来学会的。
若是没有n的取值区间超过内存大小这个限制,可以简单的用hash统计次数,排序再还原即可,即使用计数排序。
hash和期数排序有什么关系
如果是最小的话可以考虑成k个连续的数,然后每次发现一个数值就让数组对应的下标加加
桶排序的空间复杂度为O(m+n),m是数组分桶的时间复杂度,n是桶内排序时间复杂度,桶越多,时间复杂度越少。因为n的取值区间长度超过了内存长度,因此此处不能用桶排序
类似于计数排序,但是辅助空间(Hash表)的取值可能不是连续的
先用哈希函数进行压缩n-k,时间复杂度为O(你),然后进行排序,时间复杂度为O(klogk),数量级为k级别。因此整个排序的时间复杂度为O(n)
可以用桶排序,实现复杂度为o(N)
我的理解是这样的,先是用比较的方式将n个数字,通过hash函数来压缩数据的长度(键值对的形式),花费O(n);压缩过后,不同的数的个数就是K级别的了,然后进行排序即(O(klogk)或者已经有序O(1)),那么总的复杂度近似为O(n)。
两两不同的数字的个数为k,因为不知道确定的数字范围,桶排序不适合,又因为 n远远大于k, 本题使用hash表来统计,首先获得k个数及其每个数出现的次数,然后对k个数进行排序,排序的 复杂度可忽律不计,实际上就是遍历一遍n个数字,所以本位复杂度为O(n)。
使用js实现数组的冒泡排序
分析一下,小程序为什么不能分享朋友圈?
北京有一条1公里长的街道,你认为一天能收多少钱的停车费?
怎么理解产品经理与技术研发之间的关系?
好文,喜欢看,比书上的好
我是前年在培训班学的平面设计,总的来说只能教你一些最基础的,真正有用的东西都是在实际工作中加上自身空闲时间的摸索来学会的。
若是没有n的取值区间超过内存大小这个限制,可以简单的用hash统计次数,排序再还原即可,即使用计数排序。
如果是最小的话可以考虑成k个连续的数,然后每次发现一个数值就让数组对应的下标加加
桶排序的空间复杂度为O(m+n),m是数组分桶的时间复杂度,n是桶内排序时间复杂度,桶越多,时间复杂度越少。因为n的取值区间长度超过了内存长度,因此此处不能用桶排序
类似于计数排序,但是辅助空间(Hash表)的取值可能不是连续的
先用哈希函数进行压缩n-k,时间复杂度为O(你),然后进行排序,时间复杂度为O(klogk),数量级为k级别。因此整个排序的时间复杂度为O(n)
可以用桶排序,实现复杂度为o(N)
我的理解是这样的,先是用比较的方式将n个数字,通过hash函数来压缩数据的长度(键值对的形式),花费O(n);压缩过后,不同的数的个数就是K级别的了,然后进行排序即(O(klogk)或者已经有序O(1)),那么总的复杂度近似为O(n)。
两两不同的数字的个数为k,因为不知道确定的数字范围,桶排序不适合,又因为 n远远大于k, 本题使用hash表来统计,首先获得k个数及其每个数出现的次数,然后对k个数进行排序,排序的 复杂度可忽律不计,实际上就是遍历一遍n个数字,所以本位复杂度为O(n)。