一些简单却精妙的算法

devtools/2024/10/18 9:17:35/

文章目录

  • 1.树状数组
  • 2.红黑树
  • 3.星星打分
  • 4.欧几里得算法
  • 5.快速幂
  • 6.并查集

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

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] 作为参数。在递归返回的过程中,每个节点的父节点指针都被更新为最终的根节点,这样可以减少后续查找操作的深度。


http://www.ppmy.cn/devtools/48250.html

相关文章

「前端+鸿蒙」鸿蒙应用开发-TS接口-特殊用途

在 TypeScript 中&#xff0c;接口除了定义对象的结构之外&#xff0c;还有一些特殊用途&#xff0c;这些用途使得接口成为一种灵活的工具&#xff0c;用于提高代码的可维护性和可扩展性。 TS快速入门-接口-特殊用途 1. 定义函数类型 接口可以用来定义函数的类型&#xff0c;…

Macbook Air M1配置双屏或三屏显示-基于Displaylink软件

设备 Dell D3100扩展坞及其配件 &#xff08;海鲜市场扩展坞D3100、Dell 65W电源、B-C数据线 140元左右&#xff09; macbook M1 air 驱动下载 下载displaylink驱动 https://www.synaptics.com/products/displaylink-graphics/downloads/macos App LoginExtension可装可不…

【笔记】深度学习入门

神经网络基础 计算机视觉 1.1 人工智能的本质——线性模型 ykxb k为权重&#xff0c;b为偏置 像素点有323233072个任务点 所以权重有3072个&#xff0c;假设有10组类别&#xff0c;注意权重是一个矩阵 1.2 模型更新方法 权重一开始是随机的 权重和损失值&#xff0c;尝试…

【个人博客搭建】(23)购买服务器、域名、备案

1、服务器主要是为了有一个公网的IP地址&#xff0c;方便我们可以通过网络随时访问 2、域名是对IP地址的一个替代。简单说IP地址可能不方便记忆&#xff0c;但是自己配置的域名会简单些&#xff0c;另外暴露IP地址也不安全。(虽然也能通过域名找到IP) 3、备案。这是政策。简单所…

python之语法糖

一.语法糖 语法糖不是糖,而是编程语言中的某些特殊写法,这些写法让书写起来更加简洁,容易理解,因此被叫做语法糖 二.语法糖分类 数字分隔符 a 10_0000_0000交换变量值 a 1;b 2 a,b b,a连续比较式 a 90 if 80<a<100: print(‘优秀’)字符串乘法 a ‘_’*10列表拼…

pytest中一个场景测试的demo

注意点1&#xff1a; allure.severity 是一个装饰器&#xff0c;用于设置测试用例的严重性级别。 allure.severity_level.CRITICAL 是Allure提供的严重性级别之一&#xff0c;表示这个测试用例极为重要。allure.severity_level.BLOCKER&#xff1a;阻塞级别的问题&#xff0c…

解决Ubuntu系统/usr/lib/xorg/Xorg占用显卡内存问题原创

在Ubuntu系统中&#xff0c;/usr/lib/xorg/Xorg进程占用显卡内存的问题可能会影响系统性能&#xff0c;特别是在使用GPU进行计算任务时。以下是一些解决方法&#xff0c;可以帮助你减少或解决这个问题&#xff1a; 1. 更新显卡驱动 首先&#xff0c;确保你使用的是最新版本的…

MySQL复习题(期末考试)

MySQL复习题&#xff08;期末考试&#xff09; 1.MySQL支持的日期类型&#xff1f; DATE,DATETIME,TIMESTAMP,TIME,TEAR 2.为表添加列的语法&#xff1f; alter table 表名 add column 列名 数据类型; 3.修改表数据类型的语法是&#xff1f; alter table 表名 modify 列名 新…