对象列表,按键排序的最快方式(其中一个成员)(复杂性比较)

时间:2016-10-21 02:22:22

标签: c++ sorting set time-complexity

给出容器中无法修改的对象列表 / *这是一张地图<>。排序顺序基于'name'* /

struct Obj {
    // those and some other data is stored here
    string name;
    int key; // unique index
};

需要key订购。 哪种方式更快?

我可以:

  1. 将它们插入到std :: 设置然后迭代以获取订单。

    根据C ++标准,对std :: set中元素的迭代按std :: less或可选的比较谓词模板参数确定的排序顺序进行。

    < / LI>
  2. 或者将它们插入数组,std :: vector和排序。 (预期标准排序为O(n*log(n))

  3. 你能想到其他更快的方法吗?在初始容器中,它们按name排序,这与key索引值无关。
  4. 对象数量可以是100到10000。

    我认为使用方法1会更快。即使下面的分析(如果正确)表明它们具有相同的O复杂度(n * log(n))。

    Complexity将N个对象插入集合:

    log(1)+log(2)+log(3)+....+log(n)
    =log(n!)
    =O(n*log(n)-n + O(log(n)))
    =O(n*log(n))
    

1 个答案:

答案 0 :(得分:0)

根据我的经验,您问题的最佳解决方案是:

vector<set<Obj>::const_iterator> vec;
vec.reserve(set_of_obj.size());
insert into vector;
sort the vector using a custom comparator.

一些解释:

  • 排序集:: const_iterator保证比排序Obj更快。迭代器是基于指针的。
  • 插入向量并对向量进行排序可确保比插入集合更快。
  • 提前保留矢量大小以避免动态内存重新分配。