我最近試圖解決一些Python中的任務,並且我發現似乎具有複雜度爲O(n log n)的解決方案,但我相信它對於一些輸入是非常低效的(例如第一個參數是0
和pairs
是非常長的零列表)。平坦化嵌套循環/減少複雜性 - 互補對計數算法
它也有三個級別for
循環。我相信它可以優化,但在現階段,我不能更優化它,我可能只是缺少明顯的東西;)
所以,基本上,問題如下:
考慮的整數列表(
values
),功能需要返回索引對滿足以下條件的數:
- 讓我們假設單個索引對像
(index1, index2)
一個元組,- 然後
values[index1] == complementary_diff - values[index2]
我真的,例:如果給定的像作爲
[1, 3, -4, 0, -3, 5]
和values
作爲1
complementary_diff
列表 ,函數應該返回4
(這是索引對以下列表的長度:[(0, 3), (2, 5), (3, 0), (5, 2)]
)。
這是我迄今爲止,它應該很好地工作的大部分時間,但 - 正如我所說的 - 在某些情況下,它可能運行非常緩慢,儘管其複雜性的近似爲O(n日誌N )(看起來像悲觀的複雜性是O(n^2))。
def complementary_pairs_number (complementary_diff, values):
value_key = {} # dictionary storing indexes indexed by values
for index, item in enumerate(values):
try:
value_key[item].append(index)
except (KeyError,): # the item has not been found in value_key's keys
value_key[item] = [index]
key_pairs = set() # key pairs are unique by nature
for pos_value in value_key: # iterate through keys of value_key dictionary
sym_value = complementary_diff - pos_value
if sym_value in value_key: # checks if the symmetric value has been found
for i1 in value_key[pos_value]: # iterate through pos_values' indexes
for i2 in value_key[sym_value]: # as above, through sym_values
# add indexes' pairs or ignore if already added to the set
key_pairs.add((i1, i2))
key_pairs.add((i2, i1))
return len(key_pairs)
對於給定的例子,它的行爲像:
>>> complementary_pairs_number(1, [1, 3, -4, 0, -3, 5])
4
如果你看怎麼樣的代碼可以「扁平化」或「簡化」,請讓我知道。
我不確定是否只是檢查complementary_diff == 0
等是最好的方法 - 如果您認爲是這樣,請讓我知道。
編輯:我糾正了這個例子(謝謝,unutbu!)。
如果有什麼不夠清楚或者有什麼問題,請問他們 - 也許我可以改進我的問題:) – Tadeck 2012-01-13 15:23:05
我認爲你的例子中的'key_pairs'是'set([(3,0),(0 ,3),(5,2),(2,5)])'(注意5,而不是4)。是? – unutbu 2012-01-13 15:29:53
@unutbu:你說得對,謝謝!我編輯了這個問題。 – Tadeck 2012-01-13 15:34:19