題干:
[編程題] 用戶喜好
時間限制:3秒
空間限制:262144K
為了不斷優化推薦效果,今日頭條每天要存儲和處理海量數據。假設有這樣一種場景:我們對用戶按照它們的注冊時間先后來標號,對於一類文章,每個用戶都有不同的喜好值,我們會想知道某一段時間內注冊的用戶(標號相連的一批用戶)中,有多少用戶對這類文章喜好值為k。因為一些特殊的原因,不會出現一個查詢的用戶區間完全覆蓋另一個查詢的用戶區間(不存在L1<=L2<=R2<=R1)。
輸入描述:
輸入: 第1行為n代表用戶的個數 第2行為n個整數,第i個代表用戶標號為i的用戶對某類文章的喜好度 第3行為一個正整數q代表查詢的組數;
第4行到第(3+q)行,每行包含3個整數l,r,k代表一組查詢,即標號為l<=i<=r的用戶中對這類文章喜好值為k的用戶的個數。
數據范圍n <= 300000,q<=300000 k是整型
輸出描述:
輸出:一共q行,每行一個整數代表喜好值為k的用戶的個數
輸入例子1:
5 1 2 3 3 5 3 1 2 1 2 4 5 3 5 3
輸出例子1:
1 0 2
例子說明1:
樣例解釋: 有5個用戶,喜好值為分別為1、2、3、3、5, 第一組詢問對於標號[1,2]的用戶喜好值為1的用戶的個數是1 第二組詢問對於標號[2,4]的用戶喜好值為5的用戶的個數是0 第三組詢問對於標號[3,5]的用戶喜好值為3的用戶的個數是2
開始自己寫的代碼:
1 n = int(input()) 2 li = [int(i) for i in input().split()] 3 q = int(input()) 4 lrk = [] 5 for j in range(q): 6 lrk.append([int(k) for k in input().split()]) 7 8 def compute(li, param): 9 a = 0 10 for p in li: 11 if p == param: 12 a += 1 13 return a 14 15 for r in lrk: 16 li_a = li[r[0]-1: r[1]] 17 print(compute(li_a, r[2])) 18 19
這段代碼完全可以實現題目的操作,但是其非常費時費力;所以盡管代碼基本正確無誤,但是根本符合不了“速度”的要求;
參看了別人的例子改后的代碼:
n = int(input()) li = [int(a) for a in input().split()] d = {} for i,v in enumerate(li): if v not in d: d[v] = [i + 1] else: d[v].append(i+1) q = int(input()) for _ in range(q): l, r, k = map(int, input().split()) if k not in d.keys(): print(0) else: a = 0 for j in d[k]: if j>=l and j<=r: a += 1 print(a)
在進行少量數據的運算中,這兩種實現方法時間上看不出來什么差別;但是,當數據量成千上萬甚至十萬級別的時候,第一種方式顯然運算速度上完全落后於第二種;而且是數倍的差距;
在此,程序就不去解釋,只要稍微看一會,就能看出兩段程序的優劣!