簡體   English   中英

Python 中的相似性度量

[英]Similarity Measure in Python

我正在處理這個名為Similarity Measure的編碼挑戰。 現在的問題是我的代碼在某些測試用例中運行良好,但由於 Time Limit Exceed 問題而失敗 但是,我的代碼沒有錯,輸入范圍 10^4需要超過 25 秒。

我需要知道我可以做些什么來提高效率,我想不出比我的代碼更好的解決方案。

問題是這樣的:

問題說明給定一個正整數數組,現在我們必須根據 Q 查詢來回答。

查詢:給定兩個索引L,R,確定兩個相同元素的索引的最大絕對差值在L和R之間

如果在一個范圍內,沒有兩個相同的輸入,則返回 0

輸入格式

第一行包含 N,沒有。 數組 A 中的元素個數 第二行包含 N 個空格分隔的整數,它們是數組 A 的元素 第三行包含 Q 查詢數 每 Q 行包含 L,R

約束

1 <= N, Q <= 10^4 1 <= Ai <= 10^4 1 <= L, R <= N

OUTPUT 格式

對於每個查詢,在新行中打印 ans

樣本輸入

5 1 1 2 1 2 5 2 3 3 4 2 4 3 5 1 5

樣品 Output

 0 0 2 2 3

解釋

[2,3] - No two elements are same [3,4] - No two elements are same [2,4] - there are two 1's so ans = |4-2| = 2 [3,5] - there are two 2's so ans = |5-3| = 2 [1,5] - there are three 1's and two 2's so ans = max(|4-2|, |5-3|, |4-1|, |2-1|) = 3

這是我的算法:

  1. 以不同的方法獲取輸入並測試范圍
  2. 輸入將是 L、R 和數組
  3. L和R的差等於1,檢查下一個元素是否相等,返回1否則返回0
  4. 對於大於 1 的差異,遍歷數組
  5. 做一個嵌套循環來檢查相同的元素,如果是,將差異存儲到 maxVal 變量中
  6. 返回最大值

我的代碼:

def ansArray(L, R, arr):
    maxVal = 0
    if abs(R - L) == 1:
        if arr[L-1] == arr[R-1]: return 1
        else: return 0
    else:
        for i in range(L-1, R):
          for j in range(i+1, R):
              if arr[i] == arr[j]:
                 if (j-i) > maxVal: maxVal = j-i
        return maxVal

if __name__ == '__main__':
    input()
    arr = (input().split())

    for i in range(int(input())):
        L, R = input().split()
        print(ansArray(int(L), int(R), arr))

請幫我解決一下這個。 我真的很想學習一種不同的、更有效的方法來解決這個問題。 需要通過所有的測試用例。 :)

你可以試試這段代碼:

import collections


def ansArray(L, R, arr):
    dct = collections.defaultdict(list)
    for index in range(L - 1, R):
        dct[arr[index]].append(index)
    return max(lst[-1] - lst[0] for lst in dct.values())


if __name__ == '__main__':
    input()
    arr = (input().split())

    for i in range(int(input())):
        L, R = input().split()
        print(ansArray(int(L), int(R), arr))

解釋:

dct是一個字典,它為每個看到的數字保留一個索引列表。 該列表已排序,因此lst[-1] - lst[0]將給出該數字的最大絕對差。 max應用於所有這些差異,您將得到答案。 代碼復雜度為 O(R - L)。

這可以通過以下方式近似解決為 O(N):

from collections import defaultdict

def ansArray(L, R, arr) :
    # collect the positions and save them into the dictionary
    positions = defaultdict(list)
    for i,j in enumerate(arr[L:R+1]) :
        positions[j].append(i)

    # create the list of the max differences in index
    max_diff = list()
    for vals in positions.values() :
        max_diff.append( max(vals) - min(vals) )

    # now return the max element from the list we have just created
    if len(max_diff) :
        return max(max_diff)
    else :
        return 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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