簡體   English   中英

為時間復雜度優化相等值的索引差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM