一些简单却精妙的算法

简介: 一些简单却精妙的算法


在编程的世界里,简洁的代码往往隐藏着深邃的智慧。一起来看看那些看似简单,实则精妙绝伦的代码片段,体会编程语言的优雅与力量。

1.树状数组

int lowbit(int x)  
{    
    return x&-x;    
}

树状数组里的这个,太精妙了,树状数组使区间求和复杂度降低到了log(n),发明这段代码的人一定是个天才,而这个lowbit恰恰是最精妙的一部分,可以准确的找到我们需要加的部分,巧妙的利用了计算机的位运算。

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('数字不在范围内');  
    return '★★★★★☆☆☆☆☆'.substring(5 - rating, 10 - rating );  
}

这种实现方式之所以精妙,是因为它利用了字符串的固定模式和 substring 方法的灵活性来生成不同数量的星星,而不需要使用循环或额外的逻辑来逐个添加或删除星星。这种方法简洁且高效,特别是在需要频繁生成星级评分表示时。


然而,这段代码也有局限性,它假设评分总是整数,并且只支持0到5的评分范围。如果需要支持小数评分或更广泛的评分范围,这段代码将需要相应的调整。

4.欧几里得算法

function gcd(a, b) {  
    return b ? gcd(b, a % b) : a;   
}

这种递归实现的欧几里得算法非常简洁且高效。它利用了数学上的一个性质:两个整数的最大公约数与它们的余数和较小数的最大公约数相同。即 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;

用于高效地计算 b 的 n 次方。快速幂算法特别适用于计算大幂次的情况,因为它将幂次的计算复杂度从 O(n) 降低到 O(log n)。

6.并查集

int find(int x){  
  x==parent[x]?:find(parent[x]);  
}

并查集(Union-Find)数据结构中的 find 函数的简洁实现。


递归查找:find 函数通过递归的方式查找元素 x 的根节点。递归会在元素与其父节点不同时,继续查找父节点的父节点,直到找到一个元素其父节点是它自己的元素,即根节点。


路径压缩:代码中的三元运算符 ?: 实现了路径压缩技术。当 x 不是其根节点时(即 x != parent[x]),find 函数会调用自身并传入 parent[x] 作为参数。在递归返回的过程中,每个节点的父节点指针都被更新为最终的根节点,这样可以减少后续查找操作的深度。


相关文章
|
2月前
|
存储 C++
第六章 二叉树理论基础
第六章 二叉树理论基础
14 0
第六章 二叉树理论基础
|
2月前
|
算法
第七章 回溯算法理论基础
第七章 回溯算法理论基础
21 0
|
5月前
|
存储 算法 Python
Python算法界的秘密武器:分治法巧解难题,贪心算法快速决策,动态规划优化未来!
【7月更文挑战第9天】Python中的分治、贪心和动态规划是三大关键算法。分治法将大问题分解为小问题求解,如归并排序;贪心算法每步选局部最优解,不保证全局最优,如找零钱;动态规划存储子问题解求全局最优,如斐波那契数列。选择合适算法能提升编程效率。
74 1
|
6月前
|
算法 C++
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
47 1
算法与数据结构高手养成:朴素的贪心法(上)最优化策略
|
7月前
|
Go
IsNil() 和 IsValid() 的精妙运用
IsNil() 和 IsValid() 的精妙运用
268 0
|
7月前
|
机器学习/深度学习 算法 Java
「程序员必须掌握的算法」动态规划「中篇」
「程序员必须掌握的算法」动态规划「中篇」
|
算法 算法框架/工具
图论算法实例分析|趣味象棋
图论(graph theory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
130 0
图论算法实例分析|趣味象棋
|
存储 算法
|
算法
分治法设计技术
设计一个程序,采用分治法求含n个实数序列中的最大元素和次大元素,并分析算法的时间复杂度 1.算法设计 2.程序清单 3.运行结果
163 0
|
机器学习/深度学习 算法 搜索推荐
<<算法很美>>——(二)详解递归思想
<<算法很美>>——(二)详解递归思想
<<算法很美>>——(二)详解递归思想