58企業(yè)網(wǎng)站如何做百度搜索引擎優(yōu)化
文章目錄
- 1.樹狀數(shù)組
- 2.紅黑樹
- 3.星星打分
- 4.歐幾里得算法
- 5.快速冪
- 6.并查集
在編程的世界里,簡(jiǎn)潔的代碼往往隱藏著深邃的智慧。一起來看看那些看似簡(jiǎn)單,實(shí)則精妙絕倫的代碼片段,體會(huì)編程語言的優(yōu)雅與力量。
1.樹狀數(shù)組
int lowbit(int x)
{ return x&-x;
}
樹狀數(shù)組里的這個(gè),太精妙了,樹狀數(shù)組使區(qū)間求和復(fù)雜度降低到了log(n),發(fā)明這段代碼的人一定是個(gè)天才,而這個(gè)lowbit恰恰是最精妙的一部分,可以準(zhǔn)確的找到我們需要加的部分,巧妙的利用了計(jì)算機(jī)的位運(yùn)算。
2.紅黑樹
defun rbt-balance (tree) "Balance the rbtree list TREE." (pcase tree (`(B (R (R ,a ,x ,b) ,y ,c) ,z ,d) `(R (B ,a ,x ,b) ,y (B ,c ,z ,d))) (`(B (R ,a ,x (R ,b ,y ,c)) ,z ,d) `(R (B ,a ,x ,b) ,y (B ,c ,z ,d))) (`(B ,a ,x (R (R ,b ,y ,c) ,z ,d)) `(R (B ,a ,x ,b) ,y (B ,c ,z ,d))) (`(B ,a ,x (R ,b ,y (R ,c ,z ,d))) `(R (B ,a ,x ,b) ,y (B ,c ,z ,d))) (_ tree))) (defun rbt-insert- (x s) "Auxilary function of rbt-insert." (pcase s (`nil `(R nil ,x nil)) (`(,color ,a ,y ,b) (cond ((< x y) (rbt-balance `(,color ,(rbt-insert- x a) ,y ,b))) ((> x y) (rbt-balance `(,color ,a ,y ,(rbt-insert- x b)))) (t s))) (_ (error "Expected tree: %S" s)))) (defun rbt-insert (x s) "Insert S to rbtree X." (pcase (rbt-insert- x s) (`(,_ ,a ,y ,b) `(B ,a ,y ,b)) (_ (error "Internal error: %S" s))))
3.星星打分
function getRating(rating) { if(rating > 5 || rating < 0) throw new Error('數(shù)字不在范圍內(nèi)'); return '★★★★★☆☆☆☆☆'.substring(5 - rating, 10 - rating );
}
這種實(shí)現(xiàn)方式之所以精妙,是因?yàn)樗昧俗址墓潭J胶?substring 方法的靈活性來生成不同數(shù)量的星星,而不需要使用循環(huán)或額外的邏輯來逐個(gè)添加或刪除星星。這種方法簡(jiǎn)潔且高效,特別是在需要頻繁生成星級(jí)評(píng)分表示時(shí)。
然而,這段代碼也有局限性,它假設(shè)評(píng)分總是整數(shù),并且只支持0到5的評(píng)分范圍。如果需要支持小數(shù)評(píng)分或更廣泛的評(píng)分范圍,這段代碼將需要相應(yīng)的調(diào)整。
4.歐幾里得算法
function gcd(a, b) { return b ? gcd(b, a % b) : a;
}
這種遞歸實(shí)現(xiàn)的歐幾里得算法非常簡(jiǎn)潔且高效。它利用了數(shù)學(xué)上的一個(gè)性質(zhì):兩個(gè)整數(shù)的最大公約數(shù)與它們的余數(shù)和較小數(shù)的最大公約數(shù)相同。即 gcd(a, b) = gcd(b, a % b)。
5.快速冪
function fastPower(b, n) { if (n === 0) return 1; const result = fastPower(b, Math.floor(n / 2)); return n % 2 === 0 ? result * result : b * result * result;
用于高效地計(jì)算 b 的 n 次方??焖賰缢惴ㄌ貏e適用于計(jì)算大冪次的情況,因?yàn)樗鼘绱蔚挠?jì)算復(fù)雜度從 O(n) 降低到 O(log n)。
6.并查集
int find(int x){ x==parent[x]?:find(parent[x]);
}
并查集(Union-Find)數(shù)據(jù)結(jié)構(gòu)中的 find 函數(shù)的簡(jiǎn)潔實(shí)現(xiàn)。
遞歸查找:find 函數(shù)通過遞歸的方式查找元素 x 的根節(jié)點(diǎn)。遞歸會(huì)在元素與其父節(jié)點(diǎn)不同時(shí),繼續(xù)查找父節(jié)點(diǎn)的父節(jié)點(diǎn),直到找到一個(gè)元素其父節(jié)點(diǎn)是它自己的元素,即根節(jié)點(diǎn)。
路徑壓縮:代碼中的三元運(yùn)算符 ?: 實(shí)現(xiàn)了路徑壓縮技術(shù)。當(dāng) x 不是其根節(jié)點(diǎn)時(shí)(即 x != parent[x]),find 函數(shù)會(huì)調(diào)用自身并傳入 parent[x] 作為參數(shù)。在遞歸返回的過程中,每個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)指針都被更新為最終的根節(jié)點(diǎn),這樣可以減少后續(xù)查找操作的深度。