【发布时间】:2017-08-01 18:10:00
【问题描述】:
目前,我正在为我的大学做一个项目,在那里我确实实现了已知的数据结构(数组、链表、BST 等),并且我必须测量对它们进行一些操作所需的时间。例如,对我来说第一个是数组。我已经测量了在数组中间添加一个元素的时间(移动更多的 c 值,所以n = n + 1。它当然给了我O(n),其中 n 是元素的数量。现在我必须检查用于将元素添加到数组的开头并将元素附加到它(添加到末尾)。我有 2 个简单的算法(我不能使用 STL 或 boost::):
添加到开头:
void array::beginning_append(int value)
{
int *temp = new int[n + 1];
memcpy(temp + 1, table, sizeof(int) * n);
n = n + 1;
temp[0] = value;
delete[] table;
table = new int[n];
memcpy(table, temp, sizeof(int) * n);
delete[] temp;
}
追加到末尾:
void array::append(int value)
{
int *temp = new int[n + 1];
memcpy(temp, table, sizeof(int) * n);
temp[n] = value;
n = n + 1;
delete[] table;
table = new int[n];
memcpy(table, temp, sizeof(int) * n);
delete[] temp;
}
这些是方法或array 类,其中table 和n 是该类的成员。现在那些差别不大,我认为他们的时间会一样,而且他们是(我检查了QueryPerformanceCounter 的大量元素,比如500000,它给了我O(n) 的复杂性),但我的讲师说添加到开头会有O(n)的计算复杂度,但是从末尾添加或删除一个元素会有O(1)的复杂度,所以无论元素的数量如何,它都是const。所以我想问你们我的算法是否不好,我的意思是他们做了不必要的事情,这就是他们依赖元素数量的原因,或者我的讲师错了
【问题讨论】:
-
前置而不是乞求追加? :)
-
我应该这样做 :D 当我编码时,我说或写正确英语的能力会下降,所以我写
beggining而不是beginning -
时间没有区别,因为在这两种情况下,您都在重新分配和复制整个数组。如果您想了解为什么附加到末尾是恒定的,请阅读amortized constant time
-
欢迎编程。
标签: c++ arrays algorithm data-structures time-complexity