2016-01-31 62 views
3

我在C中有兩個整數數組,我想比較它們。這是我非常快速的入侵,但我想知道是否有更快的方法。一個比較C中未排序數組值的優雅方式?

1)找到一個不在我們正在比較的數組(arr2)中的整數。
2)複製原始數組(arr2)。
3)遍歷第一個數組(arr1),如果在複製的數組中找到該元素,我們將該索引處的值替換爲我們知道不在原始數組中的值(這是爲了防止短路當多個相同的值在數組中時)。

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 
#include <random.h> 


bool isin(int arr[], int elem, size_t len, size_t *index) { 
    int i; 
    for (i = 0; i < len; ++i) { 
     if (arr[i] == elem) { 
      if(index != NULL) 
       *index = i; 
      return true; 
     } 
    } 
    return false; 
} 

int notInArray(int arr[], size_t len) { 
    int r; 
    do { 
     r = rand(); 
    } while (isin(arr, r, len, NULL)); 
    return r; 
} 

bool arraysEqual(int arr1[], int arr2[], size_t len) { 
    size_t i, j, index; 
    int notInArr2 = notInArray(arr2, len); 

    int *arr = (int*)malloc(len * sizeof(int)); 

    for (i = 0; i < len; ++i) 
     arr[i] = arr2[i]; /*copy arr2 to arr*/ 

    for (i = 0; i < len; ++i) { 
     if (isin(arr, arr1[i], len, &index)) 
      arr[index] = notInArr2; /*replace that elemnt with something that we know is not in the original array*/ 
     else 
      return free(arr), false; 
    } 
    free(arr); 
    return true; 
} 

int main() { 
    srand(time(NULL)); 
    int a[] = { 3, 9, 1, 3, 8 }; 
    int b[] = { 1, 8, 3, 3, 9 }; 
    printf("%i\n", arraysEqual(a, b, sizeof(a)/sizeof(int))); 
    system("pause"); 
} 

我不一定要找一個源代碼,但更多的我將如何實現它一個大致的瞭解。

+1

使用'memcpy'來複制數組。 – Rabbid76

回答

1

你應該從C中抽象出一些算法問題。

您提出的算法在O(n^2)中起作用。回答你的問題,是的,如果你的整數不是很大,有一種方法可以在O(n logn)中完成,或者甚至O(n)。這是一個非常簡單的練習,你應該嘗試自己做。

6

從視圖的算法點,你的解決方案是不理想的,並且執行在O(n^2)時間的比較(因爲isin被稱爲該數組中的每個元素)和O(n)額外的空間(因爲分配數組的副本)。

有執行該任務的更便宜的方法,這裏是5替代的綱要接近:

  • 計算一個HashSet或計數字典(頻率分佈)一個陣列的和迭代其他來確定匹配值-histograms(O(n)時間,O(n)空間)
  • 與上面相同,但使用布隆過濾器,只要你不關心匹配值的頻率,而且不介意誤報的風險(O(n)時間,O(1)空間)
  • 排序一併使用二進制搜索來檢測匹配(快速排序爲O(n log n)時間,二進制搜索爲O(log n),空間爲O(1))。
  • 如果輸入陣列是不可變的,然後執行與上述相同的選擇,但排序到一個新的數組(同上時間複雜度,但O(n)空間)
  • 排序兩個陣列和檢查所有的元件相同的索引處是相等(O(2n log n)時間,O(1)空間)。
0

而不是替換與不在數組中的隨機數匹配的元素,我認爲你可以有一個指定已經找到匹配的布爾值數組。然後在你的比較中,你可以忽略這些元素的相應匹配找到的值爲true。這將節省必須搜索不在陣列中的值,並且不需要將arr2複製到arr