簡體   English   中英

所有數組元素除以每個數組元素時的商數之和

[英]Sum of quotients when all array elements is divided by each array elements

在編碼測試中遇到一個問題,假設我們有數組, arr = [4,3,8] 將數組除以4得到1(4/4)+ 0(3/4)+ 2(8/4)=3。類似地,將3除以4得到4,而將8除以1。因此輸出為3 + 4 + 1 = 8 O(n2)解決方案賦予了TLE,所以我試圖做得更好。

我想到了排序和使用下限。 arr[i]*k下界,對於k = 1,2,3... ,直到arr[i]*k<=max(arr) ,將使我的元素數量大於所取的倍數,這將使添加最終結果。 但這給了我錯誤的答案。 如何有效解決此問題,歡迎提出任何建議。

如果我正確理解了您的問題,則(在此示例中)您需要三個數組,它們是原始數組除以三個元素中的每個元素(用整數除法),然后求和。

arr = [4,3,8]
sum([el//i for i in arr for el in arr])

會給你想要的結果。 為了理解,結果列表為:

In [8]: [el//i for i in arr for el in arr]
Out[8]: [1, 0, 2, 1, 1, 2, 0, 0, 1]

總結得出結果8 如果您確實需要以這種方式分開而不是將三個數組分開,那么我將編輯此答案。

編輯所以我誤解了這個問題,對不起。 如果允許使用numpy,我建議使用此算法,該算法(我認為)仍為O(n²),但總體上要快得多:

arr = np.random.randint(1,10,n)
np.sum(np.tile(arr, n)//np.repeat(arr,n))

也許我明天可以想出一些更聰明的東西

編輯2排序實際上是一個好主意,可以稍微加快算法的速度。 到目前為止,我已經使用此腳本測試了這三種解決方案(我知道, time.time不適用於精確時間,但是它僅顯示了每種算法的總體速度):

for n in range(100, 500):
    arr = np.random.randint(1,10,n)
    #sorted
    t = time.time()
    arr2 = sorted(arr)
    sum([el1//el2 for i, el2 in enumerate(arr2) for el1 in arr2[i:]])
    t2 = time.time()-t
    times_sorted.append(t2)

    #standard
    t = time.time()
    arr = sorted(arr)
    sum([el1//el2 for el2 in arr for el1 in arr])
    t2 = time.time()-t
    times_standard.append(t2)

    #numpy
    t = time.time()
    arr = sorted(arr)
    np.sum(np.tile(arr, n)//np.repeat(arr, n))
    t2 = time.time()-t
    times_numpy.append(t2)
    if not n%50:
        print(n)

用繪圖

plt.figure()
plt.plot(times_numpy)
plt.plot(times_sorted)
plt.plot(times_standard)
plt.legend(["numpy", "sorted", "standard"])
plt.xlabel("n")
plt.ylabel("time in s")

得到:

對照

暫無
暫無

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

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