【问题标题】:How to randomize a sorted list?如何随机化排序列表?
【发布时间】:2010-04-22 16:40:31
【问题描述】:

这是一个奇怪的问题,

我有一个很好的排序列表,我希望将其随机化。我该怎么做呢?

在我的应用程序中,我有一个函数,它返回描述离散对象轮廓的点列表。由于解决问题的方式,该函数返回一个很好的有序列表。我在数学中描述了第二个边界,并想确定这两个对象是否相互交叉。我只是迭代这些点并确定是否有任何一点在数学边界内。

该方法效果很好,但我想通过随机化点数据来提高速度。由于我的数学边界很可能会被一系列彼此相邻的点重叠,我认为检查一个随机列表而不是迭代一个很好的排序列表是有意义的(因为它只需要一个点击以声明交叉点)。

那么,关于如何随机化有序列表有什么想法吗?

【问题讨论】:

  • 您确定花在随机化上的时间值得吗?如果没有,请测量:)

标签: c++ random theory


【解决方案1】:

使用std::random_shuffle。如果您想自己实现该方法,您应该查看Fisher-Yates shuffle

【讨论】:

  • 啊谢谢!很高兴我决定偷懒并在尝试重新发明轮子之前问这个问题......再次......
  • 标准的 random_shuffle 不适用于双向迭代器。
  • @SChepurin 是的,这就是我明确提到 Fisher Yates 洗牌的原因。不幸的是,大多数随机化算法在非随机访问容器上都非常慢并且不可行。
【解决方案2】:

您可以尝试random_shuffle algorithm,但请注意它不适用于list,因为它需要随机访问迭代器。不过,您可以在 vectordeque 上使用它。

【讨论】:

    【解决方案3】:

    假设您的“列表”不是指链表,而是指支持随机访问的东西(例如,数组、std::vector 或 std::deque),std::random_shuffle 可能有用。

    【讨论】:

      【解决方案4】:

      但一个关键问题是随机化列表所需的运行时间是否可能不超过按顺序遍历它的运行时间。

      也许您真正需要做的并不是将其随机化,而是以不同于从前到后的顺序阅读。例如,如果列表有 n 个成员,也许您应该处理 1、n、2、n-1、3、n-2 等或 1、n/2、2、n/2 + 1、3、n /2 +2 等

      如果您总是有相同的点数,或者如果点数落入一个小的有限集合中,您可以预先为每个可能的点数生成一个点评估顺序,可以是真正随机的,也可以是经过仔细计算的以某种方式。

      【讨论】:

      • 我认为创建一个全新的随机列表是个好主意。最坏的情况,我需要遍历列表 100 万次。
      【解决方案5】:
      整数数组[N]; for(int i = N - 1; i > 0; i--) { int j = rand() % i; int tmp = 数组[i];数组[i] = 数组[j];数组[j] = i; }

      【讨论】:

        【解决方案6】:
        std::random_shuffle(thelist.begin(), thelist.end());
        

        【讨论】:

          猜你喜欢
          • 2013-01-11
          • 1970-01-01
          • 1970-01-01
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          • 2015-11-11
          • 2019-08-24
          • 1970-01-01
          相关资源
          最近更新 更多