【发布时间】:2022-01-13 17:01:51
【问题描述】:
据我所知,我的代码有效.. 我想知道它是否可以以更好的方式完成(更好的时间复杂度)以及我的代码的时间复杂度是多少,因为我不确定如何计算它。 无法更改问题中的当前数组,但如果有更快的方法通过删除我也想知道,非常感谢。
int i = 1, j = 0, count = 1;
int arrNew[SIZE] = { NULL };
arrNew[0] = arr1[0];
while(i<size){
if (arr1[i] == arrNew[j]) { // if the element of arr1 is already added, resets j for next iteration and moves to the next element.
j = 0;
i++;
}
else {
if (j == count - 1) { // checks if we reached the end of arrNew and adds missing element.
arrNew[count] = arr1[i];
j = 0;
count++; // this variable makes sure we check only the assigned elements of arrNew.
i++;
}
else // if j < count -1 we didnt finish checking all of arrNew.
j++;
}
}
【问题讨论】:
-
不,我在 3 个未排序的数组上检查了它,它运行良好..
-
嗯。很确定这适用于未排序的数组,但是:这将退化为 n^2 最坏的情况(数组已经填充了不同的唯一值)。对于大型数组,您最好对原始数组进行排序,然后单次传递以丢弃重复项。但是,这样做会丢失原始顺序,这可能会破坏该方法的交易。根据领域的不同,计数标志指示器阵列也是可选的,如果模型合适,它会快速咆哮。无关,VLA 是大型阵列的灾难,可能也需要考虑。
-
但是我使用了 count 变量来确保我只检查数组中分配的空格,它仍然是 n^2 吗? SIZE 是方法外的变量(使用#define SIZE),因为我们还没有学习如何制作动态数组..
-
更糟糕的情况(已经不同的唯一值),运行将是 O(n^2)。考虑每次通过会发生什么。
j上的每个新项目都将与新数组中的 每个 已经分类的项目进行比较。由于它们都是独一无二的,这意味着扫描将是 1、2、3、4... (n-2)、(n-1) 次比较。这是最坏的情况 O(n^2) 结果。仅供参考,最好的情况是整个原件都填充了相同的值。这意味着在每次迭代的第一次比较后立即放弃,导致数组中只有一个最终值和 O(n) 最佳情况。 -
1.你的循环写得很混乱,因为它有条件地增加
i或j,隐藏了循环的复杂性。 2. 如果允许,最明智的方法是进行“排序到新数组”(即O(n log n)),然后在第二遍中删除重复项(或者,这可以使用“部分排序”逐步完成,但这复杂性更差:AFAICTO((n/m)n log(m))如果以 m 大小的块完成,3. 如果您想保留原始顺序,您可以将 #2 方法放入临时缓冲区,然后分配一个位集并再次传递输入,进行二分搜索并标记它。
标签: arrays c duplicates