通俗易懂的Dijkstra算法
看了下网上的一些讲的这个算法,有的说的太复杂了
其实一点都不通俗易懂
我们假设有A、B、C、D、E四个节点,我们想找到从A到E的最短路径(边权和最小)
我们定义DA(x)D_A(x)DA(x)表示当前计算出来的从A到X的最短距离
定义C(X,Y)C(X,Y)C(X,Y)表示从X直接到Y的距离
12345A——8——B| ╲ ╲ 2 18 15| ╲ ╲C——9——D——11——E
文字描述
记全部节点所在的集合为U
先构建一个映射f:x→DA(x),x∈{B、C、D、E}f: x \rightarrow D_A(x),x\in\{B、C、D、E\}f:x→DA(x),x∈{B、C、D、E},再构建一个集合C:{}C:\{\}C:{}来存放已经寻找过了的节点。
初始化
初始从A开始直接寻找,然后将结果直接存放在fff中,C:{A}C:\{A\}C:{A}
循环迭代
寻找fff值域中值最小的项对应的节点,且该节点没有被搜索过。记该节点为NNN
从该节点作为桥梁进行搜索
对于{x∣x∈U,x∉C}\{x|x\in U,x\notin C\}{x∣x∈ ...
有意义吗?
这个世界上有多少有意义的事物呢?
哦,不是,这个世界本身是有意义的吗。人类的存在是有价值的吗?人类为何存在?物质为何存在?时间空间为何存在?
科学只研究宇宙大爆炸后的物理规律,大爆炸之前世界是怎样的?无人知晓,几百年后同样无人知晓。我们永远被困在这里。
不过,即使被困在这里,科学也能告诉我们,熵是不断增大的,能源终究会消耗殆尽。
无论宇宙的结局如何,是重新坍缩为奇点开启新一轮轮回,还是在能源的消耗后衰败。人类所谓的文明都不复存在。
那么人类所谓的文明又是什么?人类的思想?人类的思想又是什么呢?可惜的是,人类没有突破物理定律的能力,人类的大脑也不过是一堆神经细胞之间的相互作用而已。
人类很厉害,人类使用这样一个劣质的大脑竟然创造了如今的社会。
在新冠疫情之前,仿佛世界一片向好,一路高涨的经济掩盖了人类社会的拙劣。如今的经济衰退撕下了这层面具,世界这个巨大的草台班子也露出了真容。
那么,个人的存在又有什么意义?我们都是无名小卒,你活着你死了没人在意。即便世界上不曾出现过现代医学、经典物理,我们还生活在原始部落,世界不也照常运转吗,太阳东升西落,月亮阴晴圆缺。
若人类不曾存在,世界依旧。
不是人人都需要学习汇编
现在的计算机行业分得越来越细了,有软件工程,有人工智能等等,需要使用汇编的场景也算是非常少了。
计算机教学行业早该改一改了,都现在这个时间点了,还要求每个计算机专业的学生学习8086汇编,真的好笑。更加糟糕的是,我们的汇编考试非常愚蠢,汇编指令本来就很繁多,特别是对于复杂指令集而言,但是我们的考试却禁止查看参考文档。(好歹你随便参加一个什么算法比赛,都会提供参考文档吧😅)
显然我并不是想说汇编在现在就没用了,编译器、逆向工程任需要使用,但是又有多少人有这样的需求呢?特别是对于现代软件而言,大部分都是高级语言通过一层又一层的抽象实现的,各种runtime、抽象高级语言、GC的存在造成了晦涩难懂的汇编指令。我们目前学习的汇编太太太基础了。
我只想说,不是人人都需要学习汇编。
C++:狗屎语言
这段时间在写CPP大作业,才算真正被CPP恶心到
狗屎的include设计
这个是我觉得做的最垃圾的地方,c的include是真的给你include,明明是个编译型语言,必须要我指定包含哪些文件,这还需要是单向的,否则动不动就死递归include了。虽说有头文件卫士这玩意,这还是容易编译出错。
这些include还是传递性的,给代码分析器造成了不小的麻烦,导致代码提示不是慢就是质量差。
垃圾的std标准库
连个最基础的string都搞不好,考虑到当年没unicode,这个就不说了,但是为什么连个最基础的split、replace∗^*∗都不提供.
随便找一个成熟的第三方库,基本上都是自己实现了一个string
注:
replace 指的是像py中的用一个字符串替换一个字串
除此之外,像什么vector也是跟屎一样,没有contain、remove 函数
乱七八糟的包管理
其实我这句话就是错的,这种垃圾语言连包管理器都没有,使用第三方包的方式简直“百花齐放”,什么静态链接动态链接的,写一个大一点的项目还要把别人的代码放进来,把一个项目膨胀几百倍。
弱智的编译器
我在下文定义了一 ...
蓝桥杯15届Java-A组吊坠题目解析
当时考蓝桥杯(java)的时候,也没怎么学过算法,一看这道题涉及到了图论,直接就放弃了。现在回过头来学了下,写个解析。
题目
小蓝想制作一个吊坠,他手上有 n 个长度为 m 的首尾相连的环形字符串{s1, s2, · · · , sn} ,他想用 n − 1 条边将这 n 个字符串连接起来做成吊坠,要求所有的字符串连完后形成一个整体。连接两个字符串 si, sj 的边的边权为这两个字符串的最长公共子串的长度(可以按环形旋转改变起始位置,但不能翻转),小蓝希望连完后的这 n − 1 条边的边权和最大,这样的吊坠他觉得最好看,请计算最大的边权和是多少。
分析
这道题涉及到两个问题
这很显然是一个涉及到图论的问题,可以采用与最小生成树类似的算法
对于两个节点,它们之间的边权的计算
边权计算
采用动态规划来计算
1234567891011121314static int similarity(String a, String b) { a=a+a;//由于首尾相连,等效于将本身内容复制一遍再求最长公共子串 int[][] dp=new int[a.leng ...
c++UI库slint上手体验
首先这个玩意需要安装Rust开发环境
https://www.rust-lang.org/learn/get-started
然后需要Rust的某个工具链
1rustup target add --toolchain stable-x86_64-pc-windows-msvc x86_64-pc-windows-gnu
但是这玩意在国内由于网络原因根本动不了,所以先要为Rustup设置镜像仓库
可以参考下文设置环境变量
https://www.jianshu.com/p/876b1cca26d8
弄好之后,运行cmake就好了
体验感受
遗憾
没有多窗口支持
由于界面脚本与程序不同,接口都需要从UI暴露出来
缺少路由等支持
MC红石三极管
使用网上的传统三极管设计有一个缺陷,当被控制电路频率过高时,三极管无法导通。
使用传统三极管非常不稳定
但是使用红石中继器+粘性活塞就非常稳定了
于是我就用这玩意做了一个可变频的折磨🐏的。。(x
RAID0阵列重组数据恢复
本文采用DiskGenius作为主要工具
注意:似乎只有DiskGenius专业版有此功能
Step1
将所有磁盘连接电脑
step2
Attention:一定要保证磁盘的添加顺序正确,块大小设置正确
根据经验,似乎当磁盘顺序调整正确时能够识别到损坏的分区,这时候再不断调整块大小,在设置正确后就能看到全部文件
Step3
使用DiskGenius自带的分区备份功能即可备份该分区上的文件,或者直接拷贝文件也行(速度有点慢)
参考资料
DiskGenius Doc-RAID数据恢复
通过加速度传感器求出手机姿态
此篇文章可能存在错误
注:本文中四元数与三维向量的运算均为隐式转换,即$(x,y,z)=\{x,y,z,0\}$;且四元数写法表示关系为$\{x,y,z,w\}=xi+yj+zk+w$
以地面建立三维正交坐标系,记重力等效加速度为ggg(等效加速度方向向上)
以手机建立三维正交坐标系,记检测到的加速度为aaa,(假设手机静止)
那么有如下关系
qgq−1=aqgq^{-1}=a
qgq−1=a
设q={x′,y′,z′,w′}(且为单位四元数),g=(0,0,∣g∣),a=(x,y,z)q=\{x',y',z',w'\}(且为单位四元数),g=(0,0,|g|),a=(x,y,z)q={x′,y′,z′,w′}(且为单位四元数),g=(0,0,∣g∣),a=(x,y,z),根据四元数运算关系很容易求得
(w′+x′i+y′j+z′k)(∣g∣k)(w′−x′i−y′j−z′k)=xi+yj+zk其中(w′)2+(x′)2+(y′)2+(z′)2=1(w'+x'i+y'j+z'k)(|g|k)(w' ...
定积分中值定理
注:这是我的数学期末报告,发这里算了
课本的不严谨
正如何老师所言,课本上的定积分中值定理是不严谨的。
课本上的定理描述如下:
对于在[min(a,b),max(a,b)]上的连续函数f(x)有∫abf(x)dx=f(ξ)(b−a),ξ∈[min(a,b),max(a,b)]\begin{aligned}
&对于在 [\min(a,b) ,\max(a,b)]上的连续函数f(x)\\
&有\int_a^b f(x)dx=f(\xi)(b-a),\xi \in [\min(a,b) ,\max(a,b)]
\end{aligned}
对于在[min(a,b),max(a,b)]上的连续函数f(x)有∫abf(x)dx=f(ξ)(b−a),ξ∈[min(a,b),max(a,b)]
上述定理中的ξ\xiξ并不能称作中值,因为它取到了边界值。若要将其称作中值,应当将其范围限制在开区间(min(a,b),max(a,b))(\min(a,b) ,\max(a,b))(min(a,b),max(a,b))内,如下所示:
∫abf(x)dx=f(ξ)(b−a ...