如何知道数组是否已排序?

时间:2012-11-22 18:56:36

标签: c arrays algorithm sorting statistics

我已经阅读过这篇文章,但答案并不让我感到满意Check if Array is sorted in Log(N)

想象一下,我有一个超过1,000,000 double 数字(正面和/或负面)的严重大阵列,我想知道阵列是否排序"试图避免最大数量的比较,因为比较双打和花车需要花费太多时间。是否可以使用It?的统计数据,如果它是:

  1. 真正的程序员可以很好地看到它吗?
  2. 我应该带样品吗?
  3. 我应该拍多少个样本
  4. 它们应该是随机的,还是按顺序的?
  5. 允许%em错误说出 "the array sorted" 多少钱?
  6. 感谢。

9 个答案:

答案 0 :(得分:2)

这取决于您的要求。如果你可以说,如果1.000.000中的100个随机样本足够假设它已经排序 - 那么就是这样。但是要绝对肯定,你将始终必须经历每一个条目。只有你能回答这个问题,因为只有你知道你需要对它进行分类是多么肯定。

答案 1 :(得分:1)

如果使用多处理(实际并行,因此仅适用于多核CPU)运行分而治之算法,则可以在Log(N)中检查数组是否已排序。

如果你有GPU多处理,你可以很容易地实现Log(N),因为现代显卡可以并行运行几千个进程。

答案 2 :(得分:1)

您的问题5是您需要回答以确定其他答案的问题。为了确保数组完美排序,你必须遍历每个元素,因为它们中的任何一个都可能是不合适的元素。

答案 3 :(得分:1)

这是高中教授的经典概率问题。考虑this question

  

批次被拒绝的概率是多少?   在一批8,000个中,7%的时钟是有缺陷的。选择并测试来自8,000的随机样本10(无替换)。如果至少有一个有缺陷,整个批次将被拒绝。

因此,您可以从大型数组中获取大量随机样本并查看其是否已排序,但您必须注意,您需要知道样本出现故障的可能性。由于您没有这些信息,因此概率方法在此处无效。

(但是,您可以检查50%的数组并天真地断定它有50%的可能性正确排序。)

答案 4 :(得分:1)

决定阵列是否排序的最大比较数是N-1,因为有N-1个相邻的数字对要比较。但为简单起见,我们会说N,因为如果我们查看N或N + 1数字并不重要。

此外,在你开始的地方并不重要,所以让我们从一开始就开始吧。 比较#1(A [0]与A [1])。如果失败,则数组未排序。如果成功,那就好。

正如我们只比较一样,我们可以将它减少到邻居以及左边的是否小于或等于(1)或不是(0)。因此,我们可以将数组视为0和1的序列,指示两个相邻的数字是否有序。

计算错误率或可能性(正确的拼写?)我们将不得不查看0/1序列的所有组合。 我会这样看:我们有2 ^ n个数组的组合(即对的顺序,其中只有一个被排序(所有元素都是1,表示每个A [i]小于或等于A [ i + 1])。

现在这看起来很简单: 最初错误是1/2 ^ N.在第一次比较之后,可能的组合中的一半(全部未排序)被消除。所以错误率应该是1/2 ^ n + 1/2 ^(n-1)。

我不是数学家,但应该很容易计算出达到错误率所需的元素数量(找到x使得ERROR> =总和为1/2 ^ n + 1/2 ^( n-1)...... 1 / ^(2-x))

对不起令人困惑的英语。我来自德国..

答案 5 :(得分:0)

由于每个元素都可以是一个不符合要素的元素,因此必须遍历所有元素,因此算法具有运行时O(n)。

如果您对“已排序”的理解不那么严格,则需要通过“已排序”来指定您的意思。通常,“排序”意味着相邻元素满足或多或少相等的条件。

答案 6 :(得分:0)

就像其他人所说的那样,100%确定它是否被排序的唯一方法是遍历每个元素,即O(N)。

然而,在我看来,如果你担心它被排序,那么将它排序开始比将数据元素存储在内存中的连续部分更重要吗?

我得到的是,您可以使用map,其定义的元素遵循strict weak ordering。换句话说,地图中的元素始终排序。您也可以使用set来达到同样的效果。

例如:std::map<int,double> collectoin;允许您像数组一样使用它:collection[0]=3.0; std::cout<<collection[0]<<std:;endl;。当然,存在差异,但如果排序非常重要,那么数组是存储数据的错误选择。

答案 7 :(得分:0)

旧的时尚方式。打印出来,看看是否有序。真的如果你的排序错了,你很快就会看到它。如果你排序100多件东西,你不太可能只看到一些错误。当我处理它时,我的整个事情完全关闭或它的工作原理。

答案 8 :(得分:0)

作为一个例子,您可能不应该使用但演示采样大小:

统计上有效的样本量可以为您提供合理的排序估计。如果你想要95%确定eerything被排序你可以通过创建一个真正的随机点列表来做到这一点,也许~1500。

如果在一个地方出现乱序的值列表会破坏后续算法或数据要求,基本上这是完全没有意义的。

如果这是一个问题,请在代码运行之前预处理列表,或在代码中使用非常快速的排序包。大多数排序包也有一个验证模式,它只是告诉你是,列表符合您的排序标准 - 或不。其他建议,例如将您的支票与线程并行化是很好的想法。

相关问题