【问题标题】:Code optimization - cicle代码优化——循环
【发布时间】:2020-08-27 20:58:43
【问题描述】:

我想做一大段代码,直到数组 1 的至少一个元素等于数组 2 的元素 1。

如果可能的话,我要求社区分享在“同时”执行此操作的最佳(处理速度最快)方法

总结一下:

while (none of the elements from arr1 is equal to any of arr2)

{ 
    (code)
}

原因:在我的代码中,根据用户设置的某些维度,我的程序可能需要多次进行这种 n^2 复杂度比较,所以我正在寻找一种方法让它像我一样轻可以。

很抱歉,如果此类问题不适合 StackOverflow,请告诉我。

编辑:我不提供有关数组的信息是不好的。正如我所说,它的尺寸可能会根据用户的选择而有所不同,但每个尺寸都应该在 3 到 1000 之间。两个整数数组。

它们的价值确实会发生变化,维度越大,发生的可能性就越大。

【问题讨论】:

  • arr1arr2 的大小是多少——数十、数百、数千、数百万个元素?数组中元素的类型是什么?它们是简单的整数还是完整的结构,还是什么?使用散列、比较散列并仅在散列相等时检查完全相等是否有意义?任何一个数组都会改变吗?每个数组变化多少?
  • 使用哈希映射元素到整数对并不难。当您将 E 添加到 arr1 时,增加条目 E-> 的 count1。对于 arr2 和 count2 也是如此。还要保持两个计数都大于零的条目数的单个整数总 T。每次 arr1 或 arr2 中的条目更改或添加/删除时,您都可以在恒定时间内更新这些结构。然后循环变为while (T > 0)。 OTOH,如果代码块又大又慢,这可能是过早的优化。如果块需要一秒钟才能运行,比较一百万个整数可能很好。
  • 您可以对这些数组进行排序,否则它们无法更改?因为如果你能对它们进行排序,它可能会容易得多。
  • 据我所知,您无法对它们进行排序

标签: c optimization


【解决方案1】:

cmets 提到了一个哈希,我同意,它可以工作,但它非常依赖于大小。 O(n^2) 的开销在很多时候都可以忽略不计。

否则,只需将arr1 的所有元素添加到哈希集中,然后通过arr2 的元素查看它们是否在其中。你会得到O(n)时间。不过老实说,除非您使用数十万甚至数百万的元素,否则我认为收益不会那么明显,但它取决于机器,我自己还没有测试过。

C++ 在标准中有 std::unordered_set。如果您使用的是纯 C,我相信网上有可用的实现。

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2011-10-12
    • 1970-01-01
    • 2016-10-09
    • 2012-02-06
    • 2014-03-05
    • 2018-05-13
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多