帖子問題:
(同學去面試的)
1、設計乙個魔方(六面)的程式。
2、有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有重複。請用5分鐘時間,找出重複出現最多的前10條。
3、收藏了1萬條url,現在給你一條url,如何找出相似的url。(面試官不解釋何為相似)
想了一中午,寫了一下午(真服了自己,這麼鑽牛角尖,汗~),成果如下:
重點第2題,我的解法如下:
思路:由於大量的資料,同時基於儲存條件限制,盡量利用二分法,然後採用hash/binary結構,盡量避免迴圈。
------------------------------ logic & steps ------------------------------
/** 1. 對於1000萬條儲存在[硬碟, 文字檔案]的簡訊記錄,則設-> n = 10,000,000 (10 million)
* 2. 已知一條簡訊的長度是0 - 70 字元之間(最多70個字母,35個漢字),則設-> arraylistsms[70] (1-70個不同長度,空簡訊另計)
* * 3. 取 (第乙個) 字元的[最後一位(bit)],為其建立-> arraylistbitfirstchar (取值0, 1)
* 4. 取 (最後乙個) 字元的[最後一位(bit)],為其建立-> arraylistbitlastchar (取值0, 1)
* 5. 取((長度+1)除2) 字元的[最後一位(bit)]((i+1)/2),為其建立-> arraylistbitmidchar (取值0, 1)
* * 6. 檢查 (第乙個) 字元[byte],為其建立-> dictionary hashfirstcharacter(首字相同放一起)
* 7. 檢查 (最後乙個) 字元[byte],為其建立-> dictionary hashlastcharacter(末字相同放一起)
* 8. 檢查 ((長度+1)除2) 字元[byte],為其建立-> dictionary hashmidcharacter(中間字相同放一起)
* * 9. 全文[string]比較,為其建立-> dictionary hashsms(最終計數)
** 10. 維持乙個全域性 dictionarytopsms 遍歷檢驗topsms[i]中計數最小的string和當前更新的hashsms[string]的大小,小則替換,否則無操作?或者最後再檢查取前十???(這個我沒考慮哪個時間開銷更小)
*/------------------------------ logic & steps ------------------------------
/** topmostsmsreader pseudocode (c# version)
* this is a demo for reading top most sms (or alike) strings from files. partial code are pseudocode
** author: leemax li
* created: 2008.11.03
* email: [email protected]
* last modify: 2008.11.03 by leemax li
*/public
class leemaxtopmostsmsreader implements idisposable
// main entry
public dictionarylong> checknow(string filename, long maxline)
if (sms[nowsms.length].bitfirstchar[0 or 1].bitlastchar[0 or 1].bitmidchar[0 or 1].hashfirstcharacter[nowsms[0]].hashlastcharacter[nowsms[nowsms.length - 1]].hashmidcharacter[nowsms[(nowsms.length + 1) / 2]].hashsms.haskey(nowsms))
else
//currentcount = sms[nowsms.length].bitfirstchar[0 or 1].bitlastchar[0 or 1].bitmidchar[0 or 1].hashfirstcharacter[nowsms[0]].hashlastcharacter[nowsms[nowsms.length - 1]].hashmidcharacter[nowsms[(nowsms.length + 1) / 2]].hashsms[nowsms].value; // low efficiency
//checktopsms(nowsms, currentcount); // low efficiency
}checkouttops();
}catch (exception ex)
finally
return _topsms;
}private
void checkouttops()
// this is not good, should check out after all cleared out
/*private void checktopsms(string newstring, long newcount) }}
// no match found, check the smallest
if (currentsmallest < newcount) }*/
// implementation of idisposable
public
void dispose()
// attributes and others
public
int returnlength
set
}public
long currentline
}public
long currentemptysmscount}}
------------------------------ possible solution code ------------------------------
------------------------------ analysis -----------------------------
/** 根據 logic & steps 中的設計
* 1. n0 = 10,000,000 (10 million) (硬碟讀取時間)
* 2. sms[70] (不需要遍歷, n1 = 10 million / 71 < 140846)
* * 3. 取 (第乙個) 字元的[最後一位(bit)],bitfirstchar (cpu時間,不需要遍歷, n2 = n1/2 < 70423)
* 4. 取 (最後乙個) 字元的[最後一位(bit)],(cpu時間,不需要遍歷, n3 = n2/2 < 35212)
* 5. 取((長度+1)除2) 字元的[最後一位(bit)]((i+1)/2),(cpu時間,不需要遍歷, n4 = n3/2 < 17606)
* * 6. 檢查 (第乙個) 字元[byte],hashfirstcharacter(首字相同放一起)(設為 m = n4)
* 7. 檢查 (最後乙個) 字元[byte],hashlastcharacter(末字相同放一起)(設為x = n4/ln(n4))
* 8. 檢查 ((長度+1)除2) 字元[byte], hashmidcharacter(中間字相同放一起)(設為y = n4/(ln(n4)*ln(x)))
* * 9. 全文[string]比較,hashsms(最終計數)(設為z = n4/(ln(n4)*ln(x)*ln(y)))
** 10. 維持乙個全域性 topsms 遍歷檢驗(每次檢查為:n0*ln(fetchcount)次, 最後遍歷 <= n4次)
** 時間代價為:o(program): lnm*lnx*lny*lnz
n = 10000000
m = 71428.571428571428571428571428571
lgm = 11.176453228349015489585363863205
x = 6390.9873704292188700245451792576
lgx = 8.7626440534989345490873775956615
y = 729.34462833478780320337939734221
lgy = 6.5921463615017245913923031187162
z = 110.63841552338339979745756356137
lgz = 4.7062673662433216260688480137905
total cost = lgm * lgx * lgy * lgz
= 3038.3836675663354054154917591655*/
------------------------------- analysis ------------------------------
一道騰訊面試題
view plainprint?已知有個rand7 的函式,返回1到7隨機自然數,讓利用這個rand7 構造rand10 隨機1 10。using system using system.collections.generic using system.linq using system.text ...
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...