2014-02-12 86 views

回答

0

如果你有記憶騰出:

  • 創建一組,將持有的每個值的出現次數的數量。
  • 對於每一個整數我在每個組,增加我
  • 提取整數的出現次數的多少與一些OCCURENCES等於套數的

這是理論上的O(總和所有集合基數+檢索)

其中retrieveal可以是您的整數範圍(如果您使用原始數組)或您的集合的聯合的基數(如果您使用散列表來枚舉定義發生的值)。

如果你的集合的邊界是已知的而且很小,你可以用一個足夠大的整數的簡單數組來實現它(通常是256位的8位字符)。

否則,你需要某種散列表,理論上它應該在o(n)中。

1

在許多語言中,例如C++集合被實現爲平衡二叉樹,因此您可以直接在O(NlogM)中評估集合交集,只需查看O(logM)中的其他集合即可。

優化: -

當你想爲多套,你可以做到這一點是huffman coding使用的優化: -

  1. 使用的集的優先級隊列,其選擇最小的一套第一個
  2. 選擇兩個最小集合首先評估交集並將其添加到隊列中。
  3. 這樣做,直到你得到空的交集或剩下一組(交集)。

注:使用std ::設置如果用C++