re: min(x,y)高效算法 夜風 2011-08-24 22:42
@a
也許是我強調得不太清楚,我的寫這文章的目的不在于向大家介紹算法本身,這些早已是成熟的算法,我只是從一個推理的角度,介紹我再現該算法的過程。結果不重要,實現也不重要,何必這么鉆牛角尖呢?難道文章的中心思想就如此難以把握?
re: min(x,y)高效算法 夜風 2011-08-24 22:42
@a
也許是我強調得不太清楚,我的寫這文章的目的不在于向大家介紹算法本身,這些早已是成熟的算法,我只是從一個推理的角度,介紹我再現該算法的過程。結果不重要,實現也不重要,何必這么鉆牛角尖呢?難道文章的中心思想就如此難以把握?
re: min(x,y)高效算法 夜風 2011-08-23 20:18
@哎喲,還要用戶名2
z >> 32用gcc編譯會有警告:
right shift count >= width of type [enabled by default]
雖然計算結果正確,但不知會有什么隱患,所以我已經改成31,謝謝關注
re: min(x,y)高效算法 夜風 2011-08-23 19:54
@哎喲,還要用戶名2
效果一樣,多一位少一位不影響
re: min(x,y)高效算法 夜風 2011-08-23 19:52
@fuwutu
不知道你的理由是什么?沒有出現0的情況,不過少個括號倒是個問題,我忘記了&優先級低于+號,已經修正,謝謝關注
re: min(x,y)高效算法 夜風 2011-08-23 19:47
@matrix42
既然是求差值,那z顯然需要一個有符號的整型,對有符號整型右移,是算術移位
re: 一道簡單的面食題來自CSDN 夜風 2011-08-22 23:19
我找到個更好的
z = x - y;
z = (z >> 32) & z;
z = z + y;
得到min(x,y) = z
這應該是最高效的算法了,避免了if-else,也避免了乘法運算的復雜性,全部由基本運算取代
re: 做MTK筆試的總結(一) 夜風 2011-08-15 23:13
@夜風
如果不理解,還真有可能出現大問題,我曾經就遇到過一個問題,后來看匯編代碼時才回憶起<<的二元函數形式
re: 做MTK筆試的總結(一) 夜風 2011-08-15 23:07
@Chipset
不見的,有可能題目的用意在于考察是否理解<<操作符的函數形式,還有函數參數入棧順序,如果這樣理解,還是比較有技術含量的
re: 做MTK筆試的總結(一) 夜風 2011-08-15 22:58
@江浸月
哦,對的,10和6已經入棧了
<<在同一語句中連續使用,其實本質上是函數的復合調用
cout<<a+b<<" "<<a++<<" "<<b++;
本質上是
operator<<(operator<<(operator<<(cout,a+b),a++),b++)
由于c函數參數傳遞順序是從右至左,所以參數的計算次序是:
b++ //7
a++ //11
a+b //18
cout<<18
cout<<11 //應該是10,因為已經先入棧了
cout<<7 //應該是6
可以采用給節點加上額外標記的方法(算法概論中有提到):
準備兩個數組pre和post,分兩個步驟
1.采用后續遍歷算法從根節點開始遍歷
準備一個全局的計數變量tag,初始值為0
遍歷過程中,
訪問節點i之前,pre[i] = tag++;
訪問節點i之后,post[i] = tag++;
2.對于節點u,v,求出
b=min(pre[u],pre[v]);
e=max(post[u],post[v]);
然后求出一個i,滿足
域 [ pre[i],post[i] ] 包含 [ b,e ],且 post[i] - pre[i] 最小
(這個只要從0到n遍歷一下就可以求得了)
那這個i就是要求的了
算法復雜度O(n)
re: C++的流設計很糟糕 夜風 2010-07-07 02:40
@陳梓瀚(vczh)
為什么說是大忌呢?
re: 2005-2009年個人總結 夜風 2010-02-22 16:33
你的總結真讓人振奮,新的一年 我也得做點什么了,像兄臺學習!
你的總結真讓人振奮,新的一年 我也得做點什么了,像兄臺學習!
re: 如何為軟件源碼產品選擇授權 夜風 2009-10-28 23:44
這篇文章出現的太及時了!多謝!
re: 虛擬鍵盤(軟鍵盤)設計要點 夜風 2009-10-19 00:20
@OwnWaterloo
1.kbcwait4ibe是驅動級別的哦,正打算開始研究驅動呢。。。
2.哦,是的,倒是沒注意這個。。。但這命名還真是個傷腦筋的問題呢!
你這個算法有很多是多余的,而且位運算就少用+、-,看看下面的算法,感覺不錯哦
bool prjfun( int & des , int & src , int n)
{
if(n <= 0)
return false;
int mask = 1 << (n-1);
if((des & mask) != (src & mask))
{
des ^= mask;
src ^= mask;
}
return true;
}