【发布时间】:2013-02-07 05:00:52
【问题描述】:
注意,这是家庭作业。
我需要找到一个数组的模式(正值),然后如果模式大于 sizeof(array)/2(主要值)则返回该值。有些阵列两者都没有。
这很简单,但是有一个约束条件是在确定之前不能对数组进行排序,另外,复杂度必须在 O(nlogn) 的数量级上。
使用第二个约束和master theorem,我们可以确定时间复杂度 'T(n) = A*T(n/B) + n^D' 其中 A=B 和 log_B(A)=D O(nlogn) 为真。因此,A=B=D=2。这也很方便,因为显性值必须在数组的第 1、第 2 或两半中占主导地位。
使用 'T(n) = A*T(n/B) + n^D' 我们知道搜索函数将在每个级别 (A) 调用自身两次,在每个级别将问题集除以 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 中的东西来迭代和计算值。我可以创建一个大数组,然后通过索引更新计数。
【问题讨论】:
-
你的意思是在数组中找到一个大多数时间出现的值。如果出现 sizeof(array)/2 或更多,返回?
-
我不明白您在搜索什么或为什么要递归。
-
@Gabe,我猜他正在寻找数组的模式.... # 根据上面的评论,最常出现的情况。分治型递归使其更快。
-
@mike_b:您可以迭代数组,增加
map<Value,Count>,然后迭代map以找到最高计数...将是O(nlogn),因为这是插入地图的成本,无论如何迭代次数都比这少。 -
我认为他不应该使用更多的内存。您的建议(你们俩)基本上是先进行基数排序,然后从那里确定模式。 存在一个限制,即在确定之前不能对数组进行排序。
标签: c++ c algorithm recursion master-theorem