如何从数组中删除整数循环(例如1-2-3-1)

时间:2010-03-29 05:29:00

标签: c arrays graph

如果你有一个整数数组,例如1 2 5 4 3 2 1 5 9 从C中删除整数循环的最佳方法是什么? 即,上面,1-2-5-4-3-2-1是一个循环,应该删除只留下1 5 9。

我该怎么做? 谢谢!

3 个答案:

答案 0 :(得分:2)

数组中的直接搜索可能如下所示:

int arr[] = {1, 2, 5, 4, 3, 2, 1, 5, 9};
int len = 9;
int i, j;

for (i = 0; i < len; i++) {
   for (j = 0; j < i; j++) {
      if (arr[i] == arr[j]) {
         // remove elements between i and j
         memmove(&arr[j], &arr[i], (len-i)*sizeof(int));
         len -= i-j;
         i = j;
         break;
      }
   }
}

答案 1 :(得分:1)

构建图表并根据运行深度优先搜索边缘。

在访问顶点时标记顶点,在遍历图形时添加边,不添加已选择的边 - 它们将连接先前访问过的组件,从而创建循环。

从你的例子中的数组我们无法分辨出什么是循环。

在你的例子中,2 - &gt; 5和1 - &gt; 5以及1 - > 2如图(?)所示:

1 -> 2
|    |
|    V
+--> 5

那么连接哪些元素的信息在哪里?

答案 2 :(得分:1)

有一种简单的方法,O(n ^ 2)复杂度:只需从头开始迭代每个数组条目,然后在数组中搜索最后一个相同的值。如果它与您当前的位置处于同一位置,请继续。否则,删除序列(初始值除外)并继续。您应该能够使用两个嵌套的for循环和一个条件memcpy来实现它。

有一种更复杂的方式,O(n log n)复杂度。如果您的数据集很大,那么这个数据集对于性能来说会更好,尽管它实现起来更复杂,因此更容易出错。

1)对数组进行排序 - 如果使用良好的排序算法,这是O(n log n)部分。通过引用这样做 - 你想保留原件。这会将所有相同的值一起移动。按原始数组中的位置打破排序顺序关系,这将有助于下一步。

2)在排序的数组(O(n))上迭代一次,寻找相同值的运行。因为这些运行本身按位置排序,所以通过比较相邻对的相等性,您可以轻松找到涉及该值的每个循环。从原始数组中删除(不删除)每个循环,用lastinel替换除last之外的每个值(零可能有效)。不要缩小间隙,否则引用会中断。

注意:在此阶段,您需要忽略已从阵列中删除的任何端点。因为他们将解决哨兵,你只需要小心不要删除任何一端涉及哨兵价值的“跑”。

3)丢弃已排序的数组,并使用标记来关闭原始数组中的间隙。这应该是O(n)。

实际上,用任何特定语言实现这一点都留给读者练习。 : - )