程式設計珠璣第二章總結

2021-07-11 10:55:29 字數 2569 閱讀 8939

分析:如果記憶體足夠的話,可以採取第一章的點陣圖排序法,以o(n)的效率就可以解決。

如果記憶體不足的話,但是有幾個外部檔案可以儲存資料,那麼就可以採用二分查詢的思想來解決問題!!!這裡的思路比較巧妙,它不是通常意義上的二分查詢,但是思維模式很相似.我們可以通過掃瞄輸入檔案,將第一位是0的寫入乙個檔案,將第一位是1的寫入第二個檔案,然後對比這兩個檔案的資料個數,可以肯定的是:[較少的乙個檔案必然含有缺少的整數],然後可以遞迴的處理問題,將這個檔案看作是新的輸入檔案,並且記錄丟失的整數相應的位數.用python描述的**如下:

def

find_lost

(myarray):

array = myarray

lost = 0

for bit in range(31,-1,-1):

zero_array =

one_array =

checknum = 1

if(num&checknum == 0):

else:

if(len(zero_array)else:

array = one_array

lost += checknum

return lost

def

myreverse

(left,right,l):

beg,end = left,right-1

while(beg1

end -= 1

defreverse

(i,s):

myreverse(0,i,s)

myreverse(i,len(s),s)

myreverse(0,len(s),s)

對陣列中的元素進行步長為step的移位,比如a[0]<-a[step]<-a[2*step]…<-a[k*step](k*step<=n<(k+1)*step)<-a[0],這樣就進行了一次迴圈移位,然後對a[1],a[2]…a[i-1]進行相同的操作,最後就得到了將前i個字元進行迴圈移位的結果.而且對比取逆法,只需要對元素操作一遍(交換的時候是操作2遍)
def

myswap

(i,l):

defmove

(beg,step,l):

i = beg+step

t = l[beg]

while(ifor i in range(i):

move(i,3,l)

return l

def

get_count

(word):

count = [0]*26

for w in word:

count[ord(w)-97] += 1

ans = ''

for key,item in enumerate(count):

while(item!=0):

ans += chr(key)

item -= 1;

return ans

defmyquery

(obj_word,word_dict):

count = get_count(obj_word)

for words in word_dict:

if(count == get_count(words)):

print(words)

def

preprocess

(word_dict):

new_dict = {}

for words in word_dict:

count = get_count(words)

if(new_dict.get(count)==none):

new_dict[count] = [words]

else:

return new_dict

defnew_query

(obj_word,new_dict):

return new_dict[get_count(obj_word)]

首先知道當前輸入裡面一定有重複的數字,不妨假設兩個檔案a,b分別包含了x,

y個資料

,x+y

=n,x

>

y .因為

n>2k

=>

x>n2

(k代表

當前還沒

有處理的

位數) ,a沒有重複資料的情況下最多應該包含了所有2k

−1種數字,那麼

x>n2

是不合理的。因此a一定含有重複資料。[1]:直接排序,然後找到最小的k元集合。

def

fast_find_k

(array,k,t):

array.sort()

sum_min_set = 0

for item in array[0:k]:

sum_min_set += item

return sum_min_set <= t

print(fast_find_k([9,8,7,6,5,4,3,2,1],3,5))

程式設計珠璣第二章

a題給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中一32位整數。1 在檔案中至少存在這樣乙個數?2 如果有足夠的記憶體,如何處理?3 如果記憶體不足,僅可以用檔案來進行處理,如何處理?答案 1 32位整數,包括 2146473648 2146473647,約42億個整數,...

程式設計珠璣第二章ABC

問題 找出乙個不在檔案中的32位整數。注意 題目中沒有說,這40億個數是否是含有重複的資料 條件限制 1 如果有足夠的記憶體,如何處理?2 如果記憶體僅有上百位元組 記憶體不足 且 可以用若干外部臨時檔案,如何處理?舉例 比如abcdef 左移三位,則變成defabc 條件限制 空間限制 可用記憶體...

《程式設計珠璣》第二章 「啊哈!演算法」

三個問題 1.給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中的32位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如果有幾個外部臨時檔案可用,但是僅有幾百位元組的記憶體,又該如何解決該問題?記憶體足夠的情況下,可以採用位圖法。即設一...