我正在寻找一些简单实现的数据结构,以最短的时间(在最坏情况下)满足我的需求:
(1)弹出第n个元素(我必须保持元素的相对顺序不变)
(2)访问第n个元素。
我不能使用数组,因为它无法弹出元素,并且我不想在删除第i个元素后留下间隙。我尝试通过将第n个元素与下一个元素交换,再重复下去直到最后一个元素来消除间隙,但这证明是时间上的低效率,即使数组的O(1)无人能敌。
我尝试使用向量并使用“erase”进行弹出和“.at()”进行访问,但即使它比数组更好,但对于时间效率来说仍然不便宜。
我正在寻找一些简单实现的数据结构,以最短的时间(在最坏情况下)满足我的需求:
(1)弹出第n个元素(我必须保持元素的相对顺序不变)
(2)访问第n个元素。
我不能使用数组,因为它无法弹出元素,并且我不想在删除第i个元素后留下间隙。我尝试通过将第n个元素与下一个元素交换,再重复下去直到最后一个元素来消除间隙,但这证明是时间上的低效率,即使数组的O(1)无人能敌。
我尝试使用向量并使用“erase”进行弹出和“.at()”进行访问,但即使它比数组更好,但对于时间效率来说仍然不便宜。
好的,我认为在数组上实现分层向量是最适合您的目的的。虽然分层向量的概念可能会有点棘手,而且很难理解,但是一旦你了解了它,它就能够回答许多问题,并且使你更加高效地处理许多数据结构部分。所以建议您掌握分层向量的实现。
O(1)
的查找时间,但O(n)
的删除元素时间。
一个列表会给你O(n)
的查找时间,但O(1)
的删除元素时间。O(log n)
的查找时间和O(1)
的删除元素时间。但它不保留相对顺序。O(1)
。struct node {
node* list_next;
node* list_prev;
node* tree_right;
node* tree_left;
// node data;
};
警告:不要认真看待这个答案。
理论上,你可以在O(1)的时间内完成这两个操作。假设这是你想要优化的唯一操作。以下解决方案将需要大量空间(而且会泄漏空间),并且创建数据结构将需要很长时间:
使用一个数组,在数组的每个条目中指向另一个数组,该数组与其相同,但已删除该条目。
std::deque
怎么样?虽然我不是很了解它。 - Alvin Wong