![](/img/trans.png)
[英]Difference in time complexity between python .index() and .find()
[英]Optimizing index difference of equal values for time complexity
我有這段代碼可以找到列表中相等值的索引之間的最小差異。 (它找到相等值之間的最小“距離”。)我想優化其時間復雜度。 我的代碼當前在O(N ^ 2)中運行。
def func(arr):
length = len(arr)
res = 0
for i and j in range(length):
if arr[i] == arr[j]:
res = min(res,i-j)
return res
我該如何優化?
這是一個具有O(n)時間復雜度的簡單解決方案。 對於數組中的每個項目,它將存儲從中找到的第一個索引,然后再檢索它以計算差異:
def func(arr):
d = {}
return max(i - d.setdefault(x, i) for i, x in enumerate(arr))
更新:如果列表中的項目不可散列或不能排序,則需要將它們相互比較,並且只能在O(n ^ 2)時間內完成。 您可以通過從i+1
開始內部循環來改善原始代碼,這也將消除abs
。 另一個改進是調用max
一次,而不是在每次比賽之后:
def func(arr):
gen = (j - i for i in range(len(arr) - 1) for j in range(i + 1, len(arr))
if arr[i] == arr[j])
return max(gen, default=0)
請注意,以上僅適用於Python 3.x,因為2.x上的max
不支持default
參數。
更新:我可以提出的最有效的算法來解決不可哈希/可排序項目的情況是比較所有具有len(arr) - 1
差異的對,如果找不到匹配項,則比較len(arr) - 2
,依此類推。 如果列表中的所有項目都是唯一的,這當然仍然是O(n ^ 2) :
def func(arr):
for i in range(len(arr) - 1, 0, -1):
for j in range(len(arr) - i):
if arr[j] == arr[j+i]:
return i
return 0
通過將max()放在頂部並使用列表推導,可以稍微加快速度(盡管您仍然需要解決O表示法的復雜性):
def func(arr):
return max([abs(i - j)
for i in range(len(arr))
for j in range(len(arr))
if arr[i] == arr[j]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.