分析:如果記憶體足夠的話,可以採取第一章的點陣圖排序法,以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位整數 在檔案中至少缺失乙個這樣的數 為什麼?在具有足夠記憶體的情況下,如何解決該問題?如果有幾個外部臨時檔案可用,但是僅有幾百位元組的記憶體,又該如何解決該問題?記憶體足夠的情況下,可以採用位圖法。即設一...