我有一个名为structs
的{{1}}数组。
struct Test testArray[25]
包含名为Test struct
的成员。
根据成员int size
,获取另一个Test structs
数组的最快方法是什么?没有修改原始数组。
注意:数组中的项目数量可能要大得多,只是使用它进行测试,值可能是动态的。只是想要一个较慢的子集进行测试。
我正在考虑制作原始size
的副本,然后对该数组进行排序。然后返回一个testArray
数组,其中不包含前5或后5(取决于asc或desc)。
OR
迭代Test structs
寻找最大的5,然后制作原始数组的副本,不包括最大的5。这种方式似乎会比最大的5个数组迭代数组太多次已被发现。
跟进问题:
以下是我现在正在做的事情,让我知道你的想法?
考虑到我感兴趣的最大元素的数量将保持不变,我正在迭代数组并获取最大元素并将其交换到数组的前面。然后我跳过第一个元素,然后寻找最大的元素并将其交换到第二个索引......等等。直到我有前5个最大。然后我停止排序,只是将第六个索引复制到一个新数组。
这样,无论如何,我只遍历数组5次。而且我不必整理整个事情。
答案 0 :(得分:3)
selection algorithm将在O(n)时间内执行此操作,其中排序将为O(nlogn)。
引用Partial Sorting页面:
上述线性时间选择算法可用于在最坏情况线性时间O(n)中找到k个最小或k个最大元素。要找到k个最小元素,请使用线性时间中位数中值选择算法找到第k个最小元素。之后,使用第k个最小元素作为pivot来对数组进行分区。 k个最小元素将是前k个元素。
你可以在O(n)中找到k个最大的项目,虽然制作数组的副本或指向每个元素的指针数组(更聪明)也会花费你一些时间,但你必须这样做。
如果您希望我对所涉及的算法做出完整的解释,请发表评论。
更新的 关于你的后续问题,这基本上建议在列表上重复五次......这将有效。但它在列表上迭代的次数超过了你需要的次数。在一次通过中找到k个最大元素(使用O(n)选择算法)要好得多。这样你可以迭代一次来制作你的新数组,再一次做选择(如果你使用中位数中位数,你就不需要第三次迭代去除五个最大的项目,因为你可以分开工作根据第五大项目的位置分成两部分,而不是迭代一次以制作新的数组,然后再进行五次。
答案 1 :(得分:0)
如上所述,排序是O(nlogn +5)在O(5n + 5)中迭代。在一般情况下,使用排序算法找到m个最大数字是O(nlog + m),并且在迭代算法中找到O(mn + m)。哪种算法更好的问题取决于m和n的值。对于值为5的迭代,最好是2到5的数字I.e.但是就操作而言,排序比迭代更加密集,因此它会更快,直到更快。
你可以通过使用目前为止最大数字的排序srray和二进制搜索来做得更好,以维持给你O(nlogm)的顺序,但这又取决于n和m的值。
答案 2 :(得分:0)
也许数组并不是您想要的最佳结构。特别是因为每次添加新值时都需要对其进行排序。也许链接列表更好,插入排序(最坏情况下为O(N),最佳情况下为O(1)),然后丢弃最后五个元素。此外,您必须考虑只需切换指针比重新分配整个数组快得多,只需获得另一个元素。
为什么不是AVL树?遍历时间为O(log2N),但您必须考虑重新平衡树的时间,以及编码时间是否值得。
答案 3 :(得分:0)
使用min-heap
数据结构并将堆大小设置为5
,当堆的最小元素小于数组中的元素时,您可以遍历数组并插入到堆中。
getMin
需要O(1)
次,插入需要O(log(k))
时间,其中k
是堆的元素大小(在我们的例子中是5
)。所以在最坏的情况下,我们有复杂度O(n*log(k))
来找到最多5个元素。另一个O(n)
将获取排除列表。