2016-10-18 41 views
0

在我遇到的情況中,我想定義「優雅」具有1)常量O(1)時間複雜度用於檢查物品是否存在和2)只存儲物品,僅此而已。Python:用於存儲物品以檢查物品是否存在於容器中的優雅方式

例如,如果我使用列表

num_list = [] 
for num in range(10): # Dummy operation to fill the container. 
    num_list += num 
if 1 in num_list: 
    print("Number exists!") 

操作 「中的」 將根據[Link]

採取O(n)的時間爲了實現持續的檢查時間,我可以使用字典

num_dict = {} 
for num in range(10): # Dummy operation to fill the container. 
    num_dict[num] = True 
if 1 in num_dict: 
    print("Number exists!") 

在一本字典,操作的情況下「中的」成本根據[Link]的O(1)時間,但需要額外的O(n)存儲來存儲虛擬值。因此,這兩個實現/容器都顯得不夠優雅。

什麼是更好的實現/容器來實現恆定的O(1)時間來檢查項目是否存在,而只存儲項目?如何將資源需求保持在最低水平?

+2

你可能想要的是一個集合,它仍然有O(n)個存儲需求,但是你不必爲每個值存儲'True'值。否則,如果你不想O(n)存儲,你可以使用類似布隆過濾器的東西,但它有其他的折衷,因爲它是一個概率數據結構 –

+1

我想你正在尋找集合。 – skrrgwasme

+1

你們是正確的,集合正是我所需要的。我應該更徹底地閱讀我自己的鏈接。你會推薦我刪除這個問題,因爲它很基礎嗎? 弗朗西斯科:你介意提交一個答案嗎?我會接受它,但也許mods會在稍後刪除我的問題。如果是這樣,我提前道歉。 – Sean

回答

1

這裏的解決方案是使用set,它不要求您爲每個值保存一個虛擬變量。

0

通常情況下,您無法同時優化空間和時間。你可以做的一件事就是獲得關於數據範圍(這裏是num的最小值到最大值)和數據大小(這裏是循環運行的次數,即10)的更多細節。然後,你將有兩個選擇:

  1. 如果範圍限制,然後去字典法(甚至使用數組索引法)
  2. 如果大小限制,然後去列表的方法。

如果你選擇正確的方法,那麼你很可能會實現一定的時間和空間大樣本

編輯: 設置 這是一個哈希表,實現非常類似於Python的字典一些優化,利用值始終爲空的事實(在一個集合中,我們只關心關鍵字)。設置操作確實需要迭代至少一個操作數表(在聯合的情況下)。 迭代不比任何其他集合(O(n))便宜,但平均而言,成員資格測試爲O(1)。

相關問題