【问题标题】:How to get sorted elements from an starting index to a ending index in an array? [closed]如何从数组的起始索引到结束索引的排序元素? [关闭]
【发布时间】:2014-01-11 16:33:43
【问题描述】:

给定一个包含 t 个整数的数组,我们需要回答 x 个查询。每个查询描述一个起始索引和一个结束索引,我们需要打印子数组中的排序元素。 例如-
数组={16,9,10,19,2}
对于查询 1 3 ,答案将是
9 10 16
对于查询 2 5,答案将是
2 9 10 19
请提出最佳解决方案?是否涉及任何高级数据结构?
元素个数最多可达 10^5。

【问题讨论】:

  • 所有需要的算法都在标准库中实现,即std::vectorstd::sort。您可以轻松找到两者的参考资料。这些是否允许使用?如果是这样,那就很简单了。
  • 这里是排序后的数组,2, 9, 10, 16, 19。查询一:9, 10, 16 有道理。查询二没有
  • 你可以对数组进行排序吗?
  • @user3092832 请在问题中包含您的解决方案想法和附加要求。还有n的查询数量是更低还是更高?查询的长度是多少?
  • @user3092832:这是需要在问题中提出的那种要求,我并不是说 20 分钟后我们都已经花时间写答案给你。

标签: c++ algorithm sorting data-structures


【解决方案1】:

用它的位置标记每个元素:

16 1, 9 2, 10 3, 19 4, 2 5

排序:

2 5, 9 2, 10 3, 16 1, 19 4

对于每个查询,遍历结果并返回范围内的元素。

在预处理每个查询后,O(N) 工作。

【讨论】:

  • +1:很好,你明白了。 OP 说“必须在之后进行排序”让我失望,这当然不是真的。
  • 非常感谢。我一定会尝试这种方法
【解决方案2】:

是否涉及任何高级数据结构?

不,一点也不。首先,您获取这些索引给出的范围,然后对结果范围进行排序。然后你打印它。看起来很简单!

其实很简单,我给大家举个例子:

#include <algorithm>
#include <vector>
#include <iostream>
#include <cassert>

template <typename T, size_t N>
size_t len(T (&)[N])
{
   return N;
}


int main()
{
    int array[] = {16,9,10,19,2};

    const int START = 1;  // user input ( 1-based index,)
    const int END   = 3;  // user input (inclusive range)

    assert((START-1) >= 0 && (START <= len(array)));
    assert((END-1)   >= 0 && (END <= len(array)));

    // These two lines do the work.
    // Everything else is just exposition.
    // 
    // First construct a vector from the requested subrange,
    // then sort that resulting vector.
    // 
    std::vector<int> v(array+(START-1), array+END);
    std::sort(std::begin(v), std::end(v));

    // Output the results to console for demo.
    // Uses C++ ranged-for syntax; replace with more
    // verbose equivalent if required, or do something
    // else with `v`.
    // 
    for (auto elm : v) {
       std::cout << elm << ' ';
    }
}

// Output: 9 10 6

Live demo

您可以通过将子范围复制到std::set 而不是std::vector 来使代码更加简洁(并且可能更高效),因此排序发生在插入期间而不是之后-事实。与您的说法相反,我认为两者都不会像 O(n^2) 一样多。

您能否进行充分的预处理以在各个查询之间共享信息并进一步降低复杂性?我不知道。我不这么认为。

【讨论】:

  • 最坏情况下的时间复杂度是 O((n^2)*queries)。我需要比这更好
  • @user3092832 std::sort 没有最坏情况下的时间复杂度 - 它是 unspecified。你在哪里读到的?
  • @VladfromMoscow:在英国,我们认为这并不先进。如果一个向量在莫斯科是“高级”的,那很好。
  • @VladfromMoscow:请不要构造稻草人论据。一些标准容器我称之为“高级”的。我只说向量不是一个。
  • @VladfromMoscow 当大小改变时也看起来像一个数组。它本质上是最简单的存储元素的方法;在连续的内存块中。 BTW std::array 也有自己的方法。
【解决方案3】:

如果我理解了您的问题:排序。
你可以使用任何你想要的排序算法,Wikipedia 列出了一些。

根据您选择的算法,您可能需要额外的内存/数据结构。

如果要稍后进行排序,请复制数组并对副本进行排序。比为每个查询一遍又一遍地排序更有意义。

【讨论】:

  • 最坏情况下的时间复杂度是 O((n^2)*queries)。我需要比这更好
猜你喜欢
  • 2021-10-12
  • 2012-11-23
  • 1970-01-01
  • 2013-02-21
  • 2013-01-04
  • 2012-02-29
  • 2013-03-25
  • 2017-06-09
  • 1970-01-01
相关资源
最近更新 更多