【问题标题】:Calculate Space and Time complexity and Improve efficiency of this program计算空间和时间复杂度并提高该程序的效率
【发布时间】:2012-06-18 17:08:48
【问题描述】:

问题

在重复数字数组中查找不重复数字的列表。

我的解决方案

   public static int[] FindNonRepeatedNumber(int[] input)
    {
        List<int> nonRepeated = new List<int>();
        bool repeated = false;

        for (int i = 0; i < input.Length; i++)
        {
            repeated = false;

            for (int j = 0; j < input.Length; j++)
            {
                if ((input[i] == input[j]) && (i != j))
                {
                    //this means the element is repeated.
                    repeated = true;
                    break;
                }
            }

            if (!repeated)
            {
                nonRepeated.Add(input[i]);
            }
        }

        return nonRepeated.ToArray();
    }

时间和空间复杂度 时间复杂度 = O(n^2) 空间复杂度 = O(n)

我不确定上面计算的时间复杂度,以及如何使这个程序更高效和快速。

【问题讨论】:

  • 你现在在面试吗? :D
  • 很抱歉,您要问的实际问题是什么?
  • 明确一点:这是 C++ 吗?它必须是 C++ 还是可以是任何语言或伪代码?
  • @RobertHarvey 不,我实际上正在准备一个
  • @jsalonen 我想知道如何让这个程序更高效,我计算的复杂度是否正确?

标签: algorithm complexity-theory time-complexity


【解决方案1】:

你提供的算法的复杂度是O(n^2)

使用 Hashmap 来改进算法。伪代码如下:

public static int[] FindNonRepeatedNumbers(int[] A)
{
Hashtable<int, int> testMap= new Hashtable<int, int>();

for (Entry<Integer, String> entry : testMap.entrySet()) {
            tmp=testMap.get(A[i]);
            testMap.put(A[i],tmp+1);
}

/* Elements that are not repeated are:

Set set = teatMap.entrySet(); 
// Get an iterator 
Iterator i = set.iterator(); 
// Display elements 
while(i.hasNext()) { 
Map.Entry me = (Map.Entry)i.next(); 
if(me.getValue() >1)
{
    System.out.println(me.getValue()); 
}
} 

操作: 我在这里所做的是我使用带有 keys 的 Hashmaps 来作为输入数组的元素的 hashmaps。 hashmap 的 就像每个元素的计数器。因此,如果一个元素出现一次,则该键的值为 1,并且该键值随后根据输入数组中元素的重复出现递增。

所以最后你只需检查你的 hashmap,然后显示 hashvalue 为 1 的元素,这些元素是非重复元素。如果输入数组长度为k,则该算法的时间复杂度为O(k)(用于创建hashmap)和O(k)(用于搜索)。这比O(n^2) 快得多。最坏的情况是根本没有重复的元素。伪代码可能很乱,但这种方法是我能想到的最好方法。

【讨论】:

    【解决方案2】:

    时间复杂度 O(n) 意味着您不能有内部循环。一个完整的内循环是 O(n^2)。

    【讨论】:

      【解决方案3】:

      两个指针。开始和结束。当相同的字母到达时开始递增并存储开始和结束位置,长度以供参考......否则增加结束......继续这样做直到列表结束......比较所有输出,你应该有最长的连续唯一数字列表。我希望这是问题所要求的。线性算法。

      void longestcontinuousunique(int arr[])
      {
      int start=0;
      int end =0;
      while (end! =arr.length())
      {
      if(arr[start] == arr[end])
      {
      start++;
      savetolist(start,end,end-start);
      }
      else
      end++
      }
      
      return maxelementof(savedlist);
          }
      

      【讨论】:

      • 如果你想要第一个列表..只要找到一个就输出它。
      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2019-06-02
      • 2015-07-22
      • 2012-05-07
      相关资源
      最近更新 更多