利用二分搜尋求第k大的值

2021-08-26 15:26:13 字數 2110 閱讀 9372

這是自己寫的第乙個程式,前幾天幫忙做筆試,什麼都不會,用一次次加一迭代完成,結果超時,這幾天學習了一下資料結構,感覺很有收穫,又嘗試著寫一寫這個程式,忙活一下午才完成,不過還是很有成就感的,時間對比如下:

1000000 1000000

old:127928448,time:12.6369     new:127928448,time=0.0000

10000000000 10000000000

new:20478570792960,time=0.0001

可見時間複雜度優化還是henm很明顯的哈哈!

問題:乙個等式x+y=x|y(或運算),給出乙個正整數x,滿足等式的正整數y有很多個,從第乙個開始由小到大數y,給定乙個正整數k求第k個y。

輸入樣例:共t組測試用例

tx1 k1

x2 k2

要求:2s內完成所有測試用例

實現如下:python3.6

import time

def tobin(a):

return bin(int(a))[2:][::-1]

def tonode(a):

if a=='0':

return [0,1,2]

else:

return [0,0,1]

def __init__(data_bin):

size=

node=

multi=

if data_bin[0]=='0':

else:

return size,node,multi

def twosearch(seq,size,i,node):

result='1'

i-=1

key=seq

while i>=0:

if size[i]==0:

result+='0'

i-=1

else:

if key>size[i]:

result+='1'

key-=size[i]

else:

result+='0'

i-=1

return int(result,2)

def fun_new(x,k):

i=1data_bin=tobin(x)

data_len=len(data_bin)

size,node,multi=__init__(data_bin)

k=int(k)

if sum(size)>=k:

return 1

while 1:

if i=k:

break

else:

i+=1

seq=k-sum(size[:-1])

result=twosearch(seq,size,i,node)

return result

def fun_old(x,k):

k=int(k)#input

x=int(x)#input

y=0for i in range(k):

y+=1

while x|y!=x+y:

y+=1

return y

if __name__ == '__main__':

t = int(input())

for i in range(t):

x,k = input().split()

# start_old = time.clock()

# result_old=fun_old(x,k)

# end_old=time.clock()

start_new = time.clock()

result_new=fun_new(x,k)

end_new=time.clock()

#print("old:%d,time:%.4f new:%d,time=%.4f" %(result_old,end_old-start_old,result_new,end_new-start_new))

print("new:%d,time=%.4f" %(result_new,end_new-start_new))

1105 第K大的數 二分搜尋

1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...

1105 第K大的數 二分

1105 第k大的數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數...

1105 第K大的數 思維,二分)

陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是 a 0 b 0 a 0 b 1 a 0 b n 1 a 1 b 0 a 1 b 1 a 1 b n 1 a n 1 b 0 a n 1 b 1 a n 1 b n 1 是陣列a同陣列b的組合,求陣列c中第k大的數。例如 a 1 2 3...