我编写了以下代码,尝试在O(log n)运行时执行插入到排序向量中:
std::vector<int> to_insert_sort {2,3,5,6,1,1,3,2};
int to_insert {3};
std::sort(to_insert_sort.begin(), to_insert_sort.end()); //O(log n)
auto pos = std::upper_bound(to_insert_sort.begin(), to_insert_sort.end(), 5); //O(log n)
to_insert_sort.insert(pos, to_insert); //O(n)
1)我是否正确地说这个操作是O(log n)?
2)是否有提高运行时效率的方法来执行此操作?
答案 0 :(得分:2)
1)我是否正确地说这个操作是O(log n)?
std::sort
O(n * log n)
std::upper_bound
O(log n)
std::vector.insert
O(n)
2)是否有办法在增加运行时间的情况下执行此操作 效率η
是的,您可以在O(log n)中插入,但您需要更改数据结构。例如,您可以使用std::multiset<int>
代替std::vector<int>
。
std::multiset<int> m;
//m<={2,3,5,6,1,1,3,2}; //O(n * log n)
int to_insert {3};
m.insert(to_insert); //O(log n)