- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个我在下面写的方法。
public static long nlgn(double[] nums) {
long start = System.nanoTime();
if(nums.length > 1) {
int elementsInA1 = nums.length/2;
int elementsInA2 = nums.length - elementsInA1;
double[] arr1 = new double[elementsInA1];
double[] arr2 = new double[elementsInA2];
for(int i = 0; i < elementsInA1; i++)
arr1[i] = nums[i];
for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
arr2[i - elementsInA1] = nums[i];
nlgn(arr1);
nlgn(arr2);
int i = 0, j = 0, k = 0;
while(arr1.length != j && arr2.length != k) {
if(arr1[j] <= arr2[k]) {
nums[i] = arr1[j];
i++;
j++;
} else {
nums[i] = arr2[k];
i++;
k++;
}
}
while(arr1.length != j) {
nums[i] = arr1[j];
i++;
j++;
}
while(arr2.length != k) {
nums[i] = arr2[k];
i++;
k++;
}
}
double max = nums[nums.length - 1];
double min = nums[0];
double[] farthestPair = {max, min};
long end = System.nanoTime();
return (end - start);
}
这基本上是一个合并排序操作,一旦排序,就会找到最小和最大的数字。我相信这种方法可以在 O(n lgn) 时间内运行。但是,当我以每次运行时加倍的输入大小(1000、2000、4000 等)运行该函数时,当我以纳秒为单位计时时,我得到以下结果。
First pass: (0.12) seconds
Second pass: (0.98) seconds
Third pass: (0.91) seconds
Fourth pass: (0.90) seconds
Fifth pass: (1.33) seconds
我的问题是,鉴于这些结果,这些结果是否表明此方法在 O(n lgn) 时间内运行?
最佳答案
如果你有算法的源代码,你应该分析它而不是做运行时基准测试。
在递归函数的情况下,查看 master theorem .
在您的函数中,您进行了 2 次大小为 n / 2
的递归调用, 所以 a = 2, b = 2
和 f(n) = 2n
,因为在您的前两个 for 循环中,您遍历了所有数组 (n),而在最后三个 while 循环中,您再次遍历了所有数组大小 (n),所以 2n
.
如果你应用主定理,它会给你结果 Θ(n ln(n))
, 所以 O(n ln(n))
也是正确的。
关于algorithm - 这些结果如何证明我的方法在 O(n lgn) 时间内运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716270/
一个可以用n^2 次的非递归算法解决的问题。同样的问题可以在 n lg(n) 操作中使用递归算法来解决,将输入分成两个相等的部分和 lg(n) 操作来组合两个解决方案在一起。您认为哪种算法更有效? 编
Consider the following recurrence T(n) = 3T(n/5) + lgn * lgn What is the value of T(n)? (A) Theta(n
大家好,我是蓝胖子,我一直相信编程是一门实践性的技术,其中算法也不例外,初学者可能往往对它可望而不可及,觉得很难,学了又忘,忘其实是由于没有真正搞懂算法的应用场景,所以我准备出一个系列,囊括我
现在我正在阅读算法介绍,快速排序章节。说尾递归可以用来优化。 QUICKSORT'(A, p, r) while p < r do ▸ Partition and sort left
所以无论我在哪里看到加权联合查找算法,他们都使用这种方法: 维护一个指向特定节点父节点的数组 维护一个数组,表示节点所在树的大小 对于 union (p,q) 将较小的树与较大的树合并 这里的时间复杂
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后
让 int arr[]={0,1,2,-1,4,8,9,-1,17,32,56,128}; 数组排序不包括指定数-1,我想在数组中查找一个非指定数的元素,请问有满足以下条件的算法吗? 时间复杂度为O(
我很难解决这个问题。 A[1..n] is an array of real numbers which is partially sorted: There are some p,q (1 = .
这几天我一直在努力解决这个问题。我有一个关于学校的问题,内容如下: Let A be a min-heap. The operation HEAP-MODIFY(A, i, k) changes th
我需要找到满足这些要求的数据结构: 可以从 O(n) 中的 n 个项目的列表中构建它 插入一个项目需要 O(lgn) 提取中位数需要 O(lgn) 提取第二小的项目需要 O(lgn) 对于前三个要求,
我有一个我在下面写的方法。 public static long nlgn(double[] nums) { long start = System.nanoTime();
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
假设您有很多(键,值)对象要跟踪,有很多插入和删除。 您需要满足 3 个要求: 获取任意时刻恒定时间内的最大 key 以对数时间查找任何键的值。 插入和删除需要对数时间。 是否有一种数据结构可以做到这
矩阵 A 按行和列排序,其中 A[i][j] = 0 ) { if ( mat[i][j] == x ) { printf("\n Found a
我想找到一种多线程算法,将 $n x n$ 矩阵乘以 n 向量,实现 $\Theta(n^2/lgn)$ 并行性,同时保持 $\Theta(n^2)$ 工作。 我知道一个非法的解决方案,但是关于如何使
这是 CLRS 书中的一道题。Introduction to Algorithms Study Group网站对此给出了如下回答: ( http://clrs.skanev.com/04/proble
我正在阅读算法导论并尝试完成书中的练习。 练习 4.1-3 4.1-3 Implement both the brute-force and recursive algorithms for the
我是一名优秀的程序员,十分优秀!