天天看點

一種高效的符号函數算法

符号函數,也叫正負号函數,在理工科各個領域都很常見,這是一個算法簡單,但又很重要的函數。什麼是符号函數呢?其定義如下:

一種高效的符号函數算法

圖1 符号函數定義

從符号函數的定義來看,這是一個相當簡單的算法。就是這樣簡單的算法,還能優化出什麼花樣來?你還别說,還真有!請看下文,慢慢說道。

這個函數當然可以使用if-else分支結構的程式求出來。但是,分支結構會中斷指令流水,給程式高效運作帶來了很大的阻礙,是以尋找一種不帶分支結構,且指令數量少的算法,能夠提升程式的運作效率。

這裡介紹一種高效的符号函數實作方法。在大部分電腦上,使用此方法實作符号函數,隻需4條指令即可:

一種高效的符号函數算法

圖2 符号函數的實作方法一

上面的公式,隻要x不等于-2^31,都可以算出正确的答案。如果使用比較謂詞的話,3條指令就足夠了。以下兩種辦法效率更高:

一種高效的符号函數算法

圖3 符号函數實作方法二

寫成C代碼如下:

int sign(int x)
{
  Return (x>>31)-(-x>>31);
}

int sign(int x)
{
  Return (x>0)-(-x<0);
}

int sign(int x)
{
  Return (x>=0)-(-x<=0);
}           

後話:

這些高效的算法,大部分時候都用不上,因為大部分程式,并不需要很高的運作效率,對于很多軟體工程師來說,開發效率,遠比運作效率重要。這裡,介紹各種高性能的算法,其目的不是讓各位開發者執着算法的性能,而是提供一種方案,一種在某些特殊應用場景下,能夠發揮巨大作用的的技巧。本人作為一個算法工程師,緻力于各種應用場景下的算法實作,特别是大規模高速運算,經常為了讓程式運作快幾毫秒,而絞盡腦汁推敲半個月。這裡我把自身項目實踐中,積累的算法經驗,分享出來,希望能幫助到一些像我一樣緻力于高性能計算的人。如果,能給一些熱愛程式設計、熱愛算法的人一些啟發,也是極好的。