- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 QuickSelect 来查找第 K 个最小的数字。我理解了这个程序。但我对 QuickSelect 的平均时间复杂度是 O(n) 感到困惑。
我已经尝试过 Java 代码并且它有效。但我受困于时间复杂度。
public class KthSmallestNumberUsingQuickSelect {
int findKthNumber(int arr[], int left, int right, int k ) {
if(k > 0 && k <= right - left + 1) {
int pos = partition(arr,left,right);
if(pos - left == k - 1)
return arr[pos];
if(pos - left > k - 1)
return findKthNumber(arr, left, pos - 1, k);
System.out.println(k - pos + left - 1);
return findKthNumber(arr, pos + 1, right, k - pos + left - 1);
}
return Integer.MAX_VALUE;
}
int partition(int arr[], int left, int right) {
int i = left ;
int j;
int x = arr[right];
int temp = 0;
for(j=left; j<right; j++ ) {
if(arr[j] <= x) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
}
}
temp = arr[i];
arr[i] = x;
arr[right] = temp;
return i;
}
public static void main(String[] args) {
KthSmallestNumberUsingQuickSelect kq = new KthSmallestNumberUsingQuickSelect();
int arr[] = {7,10,4,3,20,15};
int k = 3;
System.out.println(kq.findKthNumber(arr,0,arr.length-1, k));
}
}
平均时间复杂度O(n)是多少?谁能给我详细解释一下吗?
最佳答案
我认为您的问题不是特定于 QuickSelect 的。您问的是大 O 表示法和平均 Theta (θ) 表示法有什么区别。
大 O 表示法描述了算法将使用的最大潜在复杂度。
另一方面,θ 表示法是问题输入的所有可能组合的平均复杂度。
还有表示最佳情况复杂性的欧米茄 (Ω) 表示法。
快速选择算法遵循与快速排序类似的复杂性,并且您是对的,两者的大 O 表示法都是 O(n^2),但在平均情况下它们更好。
如果您需要更具体的解释为什么平均情况是线性的,请阅读此 post 中的答案.
关于java - QuickSelect 平均时间复杂度 O(n) [如何实现?],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54632968/
QuickSelect 算法是否适用于重复值? 如果我有一个数组 int[] array = {9, 8, 7, 6, 6, 6, 5, 0, 1, 2, 3, 4, 5, 5, 7, 200}; 即
我目前正在实现 Quickselect Algorithm获得列表中最好的 n 个元素。在这种情况下,“最佳”元素是最大的。 我的问题如下: 我发现在有许多重复元素的情况下,这会导致性能不佳,因为最后
维基百科指出快速选择算法 (Link) 的平均运行时间为 O(n)。但是,我无法清楚地理解这是怎么回事。任何人都可以向我解释(通过递归关系 + 主方法的使用)平均运行时间是 O(n) 吗? 最佳答案
我已经实现了快速选择算法。 我有一个问题,当我在数组中使用重复项时,我的算法会陷入无限循环... 你能帮我让它工作吗? 预期复杂度为 O(n),最坏情况为 O(n^2)? #include #inc
我做了快速选择算法,就是找一个数组中第k小的数。我的问题是,它只适用于没有重复的数组。如果我有一个数组 arr = {1,2,2,3,5,5,8,2,4,8,8} 会说第三小的数是2,其实是3。 我不
是否可以使用 Hoare 分区实现 QuickSelect 算法? 至少乍一看似乎无法完成,因为 Hoare 分区不一定返回主元的索引。 我错过了什么吗? 最佳答案 使用 Hoare 分区方案,由于主
我正在学习 QuickSelect 来查找第 K 个最小的数字。我理解了这个程序。但我对 QuickSelect 的平均时间复杂度是 O(n) 感到困惑。 我已经尝试过 Java 代码并且它有效。但我
假设我们有一个数组,我们希望找到它的 K 个最小值: 有两种方法: 1.使用快速选择算法(O(n)时间复杂度和O(1)空间) 2.使用最小堆数据结构(O(NlogK)时间复杂度和O(K)空间) 我想知
如果你不介意的话,我可以帮你做一些功课。基本上,我的想法是对一组值执行快速选择,但是我们得到了一个模板,但我似乎无法弄清楚如何让这些函数与提供的内容一起工作。 问题是这些值不会正确排列,或者如果它们排
我是一名优秀的程序员,十分优秀!