javascript - 为什么基数排序的大 O 不是二次的?
问题描述
function getDigit(num, i) {
return Math.floor(Math.abs(num) / Math.pow(10, i)) % 10;
}
function digitCount(num) {
if (num === 0) return 1;
return Math.floor(Math.log10(Math.abs(num))) + 1;
}
function mostDigits(nums) {
let maxDigits = 0;
for (let i = 0; i < nums.length; i++) {
maxDigits = Math.max(maxDigits, digitCount(nums[i]));
}
return maxDigits;
}
function radixSort(nums){
let maxDigitCount = mostDigits(nums);
for(let k = 0; k < maxDigitCount; k++){
let digitBuckets = Array.from({length: 10}, () => []);
for(let i = 0; i < nums.length; i++){
let digit = getDigit(nums[i],k);
digitBuckets[digit].push(nums[i]);
}
nums = [].concat(...digitBuckets);
}
return nums;
}
这就是我学到的基数排序代码。但是如果你看 radixSort 函数,里面的 for 循环是嵌套的,据我所知,这意味着基数排序的大 O 是 O(n 2)。但是根据我学到的材料,它说基数排序的时间复杂度是O(nk)。n 是数组的长度,k 是位数(平均)。我不知道为什么它不是 O(n 2)。
解决方案
推荐阅读
- php - 如何在php中循环遍历具有共同模式的文件的多个块
- windows - GNUPG : GPG 无法打开 'c:\folder1' 没有这样的目录
- java - 在对话框中更改按钮文本颜色
- python - 是否可以在 re.sub 中使用 re.search 的结果作为变量?
- ios - 根据对象的类型对对象进行排序/隔离并创建/将其放在 arraylist 上
- sql - 如何使用 DB2 调试 BEGIN-END SQL 块?
- applescript - 邮件附件的 AppleScript 在 Mojave beta 10 中不起作用
- ios - iOS 上的 Vuforia - 如何抓取相机帧
- sql-server - AWS DMS CDC SQL Server 源在调用 sys.fn_dump_dblog 时无法启动
- python - 将项目任务标签限定为项目标签