计算程序的时间和空间复杂度以删除重复的条目

时间:2012-06-17 16:00:59

标签: performance time-complexity

什么

我编写了一小段代码来查找和删除整数数组中是否有重复的数字。我已经为此使用了List。

守则

    static int[] RemoveDuplicate(int[] input)
    {
       List<int> correctedList = new List<int>();

       for(int i = 0; i < input.Length; i++)
       {
           if (!correctedList.Contains(input[i]))
           {
               correctedList.Add(input[i]);
           }
           else
           {
               //skip
           }
       }

       return correctedList.ToArray();

    }

我的难度

我需要知道如何为这一小段代码找到时间复杂度,如果可能的话,如何优化它。

我尝试了什么

我在互联网上做了一些关于如何计算算法的时间和空间复杂度的阅读,下面是我认为的答案,但由于我是新手,我想而不是错误地假设它最好咨询一些专家。

以下是我的尝试。

List correctedList = new List(); - &GT;这将被执行一次

int i = 0; - &gt;这将执行1次

int i&lt; input.Length - &gt;这将被执行N次

i ++ - &gt;这将被执行N次

if(!correctList.Contains(input [i])) - &gt;这可以执行N次

correctedList.Add(输入[1]); - &GT;这可以执行N次

所以,总操作次数= 1 + 1 + N + N + N + N = 4N + 2

这是否等于O(N)?

并且我的计算时间复杂度的方法是否正确?

提前感谢

1 个答案:

答案 0 :(得分:4)

如果您调用的所有操作本身都是O(1),则为O(N)。列表中的Contains不太可能是O(1)。一般来说,搜索数组是O(N),这意味着你的算法是O(N ^ 2)(我认为是)。

优化选项: 1)你可以做的最好的是O(N),但这意味着你需要一个包含O(1)的函数。您可以使用哈希表(或哈希集)执行此操作。哈希表有O(1)插入和删除。

2)您可以插入维护排序顺序的结构(例如平衡树)。插入将为O(log N),解决方案的整体性能将为O(N log N)。

3)最常见也是最简单的算法可能只是对数组O(N log N)进行排序,然后扫描重复数据。