请注意,这是家庭作业。
我需要找到数组的模式(正值),然后如果模式大于sizeof(array)/2
主导值,则返回该值。有些阵列两者都没有。这很简单,但是有一个约束条件是在确定之前不能对数组进行排序,此外,复杂度必须在 O(nlogn) 的数量级上。
使用第二个约束和主定理,我们可以确定时间复杂度 'T(n) = A*T(n/B) + n^D' 其中 A=B 和 log_B(A)=D 对于 O(nlogn ) 是真实的。因此,A=B=D=2。这也很方便,因为主导值必须在数组的第一、第二或两半中占主导地位。
使用 'T(n) = A*T(n/B) + n^D' 我们知道搜索函数将在每个级别 (A) 调用自身两次,在每个级别 (B) 将问题集除以 2。我一直在弄清楚如何让我的算法考虑到每个级别的 n^2。
制作一些代码:
int search(a,b) {
search(a, a+(b-a)/2);
search(a+(b-a)/2+1, b);
}
我在这里缺少的“胶水”是如何组合这些划分的功能,我认为这将实现 n^2 复杂性。这里有一些技巧,其中主导必须是第一或第二半或两者中的主导,不太确定这如何帮助我现在解决复杂性约束。
我已经写下了一些小数组的例子,并且我已经画出了它的划分方式。我似乎无法找到一个始终返回主导值的单一方法的正确方向。
在级别 0,函数需要调用自身来搜索数组的前半部分和后半部分。这需要递归,并调用自己。然后在每一层,它需要执行 n^2 次操作。因此,在数组 [2,0,2,0,2] 中,它会将其拆分为对 [2,0] 的搜索和对 [2,0,2] 的搜索并执行 25 次操作。在 [2,0] 上的搜索将调用在 [2] 上的搜索和在 [0] 上的搜索并执行 4 次操作。我假设这些需要搜索数组空间本身。我打算使用 C++ 并使用 STL 中的东西来迭代和计算值。我可以创建一个大数组,并通过它们的索引更新计数。