簡體   English   中英

我應該使用哪種算法來優化代碼?

[英]Which algorithm should I use to optimize my code?

我有N個元素的數組A。 我必須在其中執行Q查詢。 在每個查詢中,我選擇一個索引I(從0開始)並執行以下操作

for j = I+1 to N:
  if A[j]<A[i]:
      A[j]=0

注意:查詢不是彼此獨立的。

INPUT:

  1. 第一行包含N(數組中的元素數)和Q(查詢數)
  2. 第二行包含N個空格分隔的整數
  3. Q空間分隔的整數,表示每個查詢中的選定索引

5 2 
4 3 4 3 2
3 2

輸出:

4 3 4 0 0

說明:

  1. 第一個查詢后的數組:{4,3,4,3,0}
  2. 第二次查詢后的數組:{4,3,4,0,0}

我嘗試了采用O(n * q)的蠻力解決方案。這就是我所做的。

n,q = map(int,input().split())
A = list(map(int,input().split()))
query = list(map(int,input().split()))

for i in range(len(query)):
    for j in range(query[i]+1,n):
        if A[j]<A[query[i]]:
            A[j] = 0

print(A)

我想在小於O(n * q)的情況下做上述問題。 可能嗎 。 你能告訴我們使用哪種算法嗎?

創建一個大小為N的輔助數組,如果存在帶有值i的查詢,則其每個元素將為1 ,否則為0

然后,我們可以迭代輔助數組並跟蹤存在查詢的x[i]值的最大值

在每個步驟上(將其命名為current ),如果該最大值大於當前元素的值,則將該元素更新為0這意味着存在一個查詢,其查詢值為p ,其中x[p] > x[current]因此, x[current]設置為0

這樣,我們實現了內存的整體運行時間為O(n + q)O(n)

讓我們來看一個例子:

n = 5
q = 2 
x = {4, 3, 4, 3, 2}
q[0] = 3 
q[1] = 2

最初,我們的輔助數組a將是a = {0, 0, 0, 0, 0}

第一個查詢是q[0] = 3 ,因此我們更新a[3] = 1 ,因為必須將x[3]之后的所有內容與x[3]進行比較,並在必要時進行更新。

第二個查詢是q[1] = 2 ,因此我們更新a[2] = 1 ,因為必須將x[2]之后的所有內容與x[2]進行比較,並在必要時進行更新。 現在,這與先前的查詢重疊,並且為了合並它們並決定是否應將元素更新為0 ,我們應取x[2]x[3]的最大值。

最后,我們遍歷a並跟蹤作為查詢一部分的x的當前最大值。 如果任何查詢影響 ,我們將x[i]更新為0 ,並且其值小於影響它的查詢的最大值。

我的代碼是用Java編寫的,但我希望它可以自我解釋:

int n = in.nextInt(), q = in.nextInt();
int[] x = new int[n];
for (int i = 0; i < n; i++) {
  x[i] = in.nextInt();
}
int[] a = new int[n];
while (q-- > 0) {
  int i = in.nextInt();
  a[i] = 1;
}
int max = 0;
for (int i = 0; i < n; i++) {
  if (a[i] == 1) {
    max = Math.max(max, x[i]);
  }
  if (x[i] < max) {
    x[i] = 0;
  }
}
for (int i = 0; i < n; i++) {
  out.print(x[i]);
  out.print(' ');
}

暫無
暫無

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

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