簡體   English   中英

循環遍歷兩個數組時最小化時間復雜度

[英]Minimizing time complexity when looping over two arrays

對於計算機科學入門課程,我們必須編寫一個函數來查找兩個數組的交集,每個唯一元素只顯示一次,並且不會分配比我們需要的更多空間。

例如:

數組 A = {1, 2, 3, 3, 3, 5}

數組 B = {2, 2, 2, 3, 5, 6}

A 和 B 的交集 = {2, 3, 5}

如何在不循環兩個數組的情況下完成此操作? 就目前而言,我有:

//find how large of an array I'll need
for array A 
  for array A
    if A[i] is already somewhere earlier in array A
      stop
    else 
      loop through array B 
      if A[i] is in array B, increment a counter


declare a new array of size counter  

//add unique elements to the array
for array A 
  for array A
    if A[i] is already somewhere earlier in array A
      stop
    else 
      loop through array B 
      if A[i] is in array B, add it to the new array

我有兩個幾乎相同的嵌套 for 循環,這似乎效率很低。 如果我使用 python,我可以將唯一元素附加到列表中,但是有沒有辦法在 C 中做類似的事情? 我可以只聲明一個我可能需要的最大大小的數組,但我試圖最小化空間復雜度。

如果您知道集合,則可以使用它。 時間復雜度為O(n)

您可以在此處了解有關 set 以及如何在C實現一個的更多信息。

然后你可以做這樣的事情(用Java編寫):

public int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> set1 = getSet(nums1);
    Set<Integer> set2 = getSet(nums2);

    Set<Integer> ans = new HashSet<>();

    for(Integer i: set1) {
        if(set2.contains(i)) {
            ans.add(i);
        }
    }

    int[] ret = new int[ans.size()];

    int count = 0;
    for(Integer i: ans) {
        ret[count] = i;
        count++;
    }

    return ret;
}

public Set<Integer> getSet(int[] arr) {
    Set<Integer> set = new HashSet<>();

    for(int a: arr) { set.add(a); }
    return set;
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM