一些简单却精妙的算法

文章目录

  • 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.mzph.cn/web/25912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机床联网第一课

一、不是废话的废话 照例第一篇文章先介绍下整个专栏系列的内容和背景&#xff0c;这篇文章不涉及任何代码和技术知识&#xff0c;大家都能看得懂。 1、写作初衷 自入行接触设备数据采集、设备联网工作近十年&#xff0c;期间记不清有多少次有人请我帮忙去处理公司外部的项目&…

软件下载网站源码附手机版和图文教程

PHP游戏应用市场APP软件下载平台网站源码手机版 可自行打包APP&#xff0c;带下载统计&#xff0c;带多套模板&#xff0c;带图文教程&#xff0c;可以做软件库&#xff0c;也可以做推广app下载等等&#xff0c;需要的朋友可以下载 源码下载 软件下载网站源码附手机版和图文…

新加坡高防服务器的特点

新加坡高防服务器是指位于新加坡的高性能、高安全性的服务器&#xff0c;通常用于托管网站、应用程序和其他在线服务。这类服务器通常具有以下特点&#xff0c;rak部落为您整理发布。 1. 高速网络连接&#xff1a;新加坡是亚洲地区的主要互联网枢纽&#xff0c;拥有高质量的网络…

Android14之向build.prop添加属性(二百一十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

神经网络初始化实例化的维度与调用输入数据的维度

神经网络初始化实例化的维度与调用输入数据的维度 import numpy as np import torch import torch.nn as nn import torch.nn.functional as F #from agents.helpers import SinusoidalPosEmb class SinusoidalPosEmb(nn.Module): def init(self, dim16): #dim为初始化需要设…

人脸识别和 ArcFace:用于深度人脸识别的附加角边际损失

在本文中,您将发现一种 ArcFace 方法,该方法可获得用于人脸识别的高分辨特征。阅读本文后,你将了解: 人脸识别任务如何工作。如何计算人脸匹配。SoftMax 和 ArcFace 的直观区别。ArcFace 的几何解释。ArcFace 背后的数学原理本文假定您已经熟悉用于多类分类、检测和 SoftMax…

电子设计类论文降低重复率的方法

1、知网学位论文检测为整篇上传&#xff0c;格式对检测结果可能会造成影响&#xff0c;需要将最终交稿格式提交检测&#xff0c;将影响降到最小&#xff0c;此影响为几十字的小段可能检测不出。对于3万字符以上文字较多的论文是可以忽略的。 2、上传论文后&#xff0c;系统会自…

2024.6.11总结

今天做个面试小结吧。面试了十几家android开发岗&#xff0c;在技术面都挂了。一家软件测试岗&#xff0c;二面挂了。 可见&#xff0c;一般面试有三轮&#xff0c;分别为hr面&#xff0c;专业面&#xff08;也称技术面&#xff09;和主管面。 hr面:之前广州电信的hr面挂了&a…

Vuepress 2从0-1保姆级进阶教程——标准化流程(Tailwindcss+autoprefixer+commitizen)

Vuepress 2 专栏目录【已完结】 1. 入门阶段 Vuepress 2从0-1保姆级入门教程——环境配置篇Vuepress 2从0-1保姆级入门教程——安装流程篇Vuepress 2从0-1保姆级入门教程——文档配置篇Vuepress 2从0-1保姆级入门教程——主题与部署 2.进阶阶段 Vuepress 2从0-1保姆级进阶教程—…

电影推荐系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;免费电影管理&#xff0c;付费电影管理&#xff0c;电影论坛管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;付费电影&#x…

element-plus的el-space标签的使用

el-space标签可以很方便的设置标签间距和分隔符&#xff0c;对齐方式&#xff0c;是否拆行等属性。 <script setup lang"ts"> import { onMounted, ref } from vue;const sizeref(30)</script><template><el-space wrap :size"size"…

【最新鸿蒙应用开发】——类Web开发范式2——前端语法

兼容JS的类Web开发范式 JS FA应用的JS模块(entry/src/main/js/module)的典型开发目录结构如下&#xff1a; 1. 项目基本结构 1.1. 目录结构 1.2. 项目文件分类如下&#xff1a; .hml结尾的HML模板文件&#xff0c;这个文件用来描述当前页面的文件布局结构。 .css结尾的CSS样…

MIPI A-PHY协议学习

一、说明 A-PHY是一种高带宽串行传输技术,主要为了减少传输线并实现长距离传输的目的,比较适用于汽车。同时,A-PHY兼容摄像头的CSI协议和显示的DSI协议。其主要特征: 长距离传输,高达15m和4个线内连接器; 高速率,支持2Gbps~16Gbps; 支持多种车载线缆(同轴线、屏蔽差分…

Spark RDD算子

Spark RDD算子 转换算子&#xff08;Transformation Operators&#xff09; 类别算子名称简要介绍映射类算子map对RDD中的每个元素进行操作&#xff0c;返回一个新的RDDflatMap类似于map&#xff0c;但每个输入元素可映射到0或多个输出元素mapPartitions对RDD的每个分区中的元…

在VMware虚拟机上安装win10 跳过 通过microsoft登录

在VMware虚拟机上安装win10 跳过 “通过microsoft登录” 配置虚拟机&#xff0c;将网卡断开&#xff0c; 具体操作&#xff1a; 虚拟机/设置/硬件/网络适配器/设备状态&#xff0c;取消已连接和启动时连接的两个对号&#xff0c; 再把虚拟机重启&#xff0c;然后就可以跳过这个…

通过技术优化财务规划报告,重塑企业体验

财务报告使企业的管理层能够及时、准确、清晰且一致地了解整个企业的财务业绩和风险机遇。它促进了企业内部利益相关者之间的沟通&#xff0c;从而支持基于数据驱动的洞察力提升和战略决策。但财务报告往往需要占用大量的时间来运行和准备&#xff0c;且可能使最终结论偏离核心…

什么是PV操作

PV操作是一种在操作系统中用于同步和互斥的机制,它基于信号量(Semaphore)的概念。在并发编程中,多个进程或线程可能会同时访问共享资源,PV操作可以用来确保这些访问是同步的,以防止竞态条件和数据不一致的问题。 PV操作包括两个原子操作: P操作(Proberen,测试):这…

使用 C# 学习面向对象编程:第 4 部分

C# 构造函数 第 1 部分仅介绍了类构造函数的基础知识。 在本课中&#xff0c;我们将详细讨论各种类型的构造函数。 属性类型 默认构造函数构造函数重载私有构造函数构造函数链静态构造函数析构函数 请注意构造函数的一些基本概念&#xff0c;并确保你的理解非常清楚&#x…

从入门到精通:进程间通信

引言 在现代操作系统中&#xff0c;进程是程序运行的基本单位。为了实现复杂的功能&#xff0c;多个进程常常需要进行通信。进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指多个进程之间进行数据交换的一种机制。IPC的主要目的包括数据传输、资源共享…

WDF驱动开发-电源策略(三)

多组件设备的 KMDF 驱动程序只能将请求发送到处于活动状态的组件。 通常&#xff0c;驱动程序将 I/O 队列分配给组件或组件集。 首先考虑分配给单个组件的队列。 驱动程序在组件变为活动状态时启动队列&#xff0c;并在组件空闲时停止队列。 因此&#xff0c;当 KMDF 调用队列…