ArchLinux 安装 + 大部分的软件配置
再看操作系统1
Docker 迁移一些自己的服务
Arduino开发-入门配置
Arduino开发-自定义库和示例
Dijkstra迪杰斯特拉算法
Dijkstra迪杰斯特拉算法
最短路径算法
思路
个人感觉迪杰斯特拉算法和普利姆(Prime)算法很像都是从已有集合找到最小边开始,向集合内持续添加最小边的节点。首先写出所有节点的直接路径,从已有集合开始算到其他节点的最短距离,将在这一轮中找到的最小距离所在的节点录入集合,循环……
算法示例
以这个为例我们找出节点1到其他所有节点的最短距离
1 | 画出整张表格的框架,顶点 2,3,4,5 初始集合为1,第一轮查看1到2,3,4,5的距离分别为10,无穷,无穷,5。找出第一轮的最短距离为 1-5的距离,将5加入集合。之后再也不用关注5,因为已经是最短距离了(不存在经过其他节点更小的情况,可以自行推算)。 |
代码实现
下次实现
Floyd最短路径算法
FLOYD 最短路径算法
思路
佛洛依德最短路径实际上是使用了两个邻接矩阵遍历完成的 O(n^3),一个邻接矩阵A用来保存点到点的路径权重,另一个B用来保存路径。
A的初始已经写好了点到点的直接距离,对于没有直连的点,内容都算作无穷。然后依次取中间点后再依次遍历通过这个中间点的距离,如果小于原来的A矩阵的内的距离,那么就覆写且将路径写入B矩阵。
图解例子
根据这个图做两个矩阵A(存储点到点的距离),B(存储经过点)
1 | 以上图为例,录入后的矩阵A,A[0][1]表示0节点到1节点的距离为5,A[1][0]就表示节点1到节点0的距离,无穷表示无法连接。 |
1 | 路径Path,对于B[0][1]表示 0节点到1节点需要经过什么节点 |
1 | 现在开始从头遍历,先找出节点对(就是图中什么节点可以到什么节点)有: |
如此遍历更新两个矩阵得到最后结果:
查找代码实现
现在我们得到了最后的更新结果,使用的话以A[1][0]
为例,即1节点到0节点从A矩阵可以看到1节点到0节点距离6,根据Path矩阵,看到Path[1][0] = 3
表示 1到0节点要经过3,再看1到3和3到0,Path[1][3] = -1
表示1到3直连,查Path[3][0] = 2
表示3到0经过节点2,查看3-2和2-0结果是-1,所以最后路径是1-3-2-0
,不难发现这个过程是递归的,代码实现较为简单如下:
1 | /** |
最短路径实现
再看一下最短路径的过程会发现本质就是遍历更新两个表,从选取中间节点开始遍历,找到中间节点后遍历所有节点,对比节点的值
1 | /** |
ArchLinux滚挂的一次修复
我的Arch一年没更新 滚挂了
事情是这样的:好久没用另一台电脑,登入系统的时候打开chrome想更新下插件,好死不死的退了google账号,想重新登入的,发现google账号被疯狂登出,整了一个小时才发现是chrome的问题(我是弱智)。我用的是chrome的开源版:chromium,自从21年2月份开始google的登陆api收紧了政策,只有chrome可以登陆google账号。
一开始不知道这个政策,以为是chromiu的版本问题,事发的版本是83,我用pacman upgrade了下到了93的版本,启动chromium的时候提示动态链接库缺失。
这个问题其实我是知道的,因为arch的版本更新政策比较激进,可能半个月就更新了一次,且大部分上游的软件都依赖这些最新的库,所以如果是老系统更新新软件很容易出现动态链接库的问题,我本来也没在意,pacman -F 查了下软件包的依赖库,打算更新下以来。
但是! 问题就出在了更新依赖库,我更新了一个底层依赖库 icu
,导致我reboot的时候gnome-shell这些依赖老版本库的应用都无法启动了,只能进tty看了alt + ctrl +3
回退也很麻烦我都忘了刚刚的icu是啥版本了,还更新几个其他的库,这样看来,只能全盘更新了,但是全盘更新估计也是出问题的。原因一个是我的系统太久没更新了一年了,版本跨太大还不知道有啥bug。其次我的内核是自定义的用了签名机制,如果内核更新了,原来的内核哈希码肯定对应不上新的内核,必定失败的。没办法,怀着忐忑的心情 sudo pacman -Syu
了
嗯 果然挂了
shim 签名问题
因为的内核是自定义编译的内核,比较适配我的surface硬件,为了美观开了secureboot,不然每次开机上面红色的锁的刺眼ui真的难受。secureboot是微软的一个机制,微软信任windows系统和几个第三放的bootloader(内核加载器)。这几个内核加载器呢需要我来指定内核,怎么指定呢,用shim签名(哈希)来做这件事。
举例:我的编译好的新内核,我用shim签名生成了哈希结果,我需要再下一次开机启动是enroll,引入这个签名,这样secureboot启动bootloader,bootlaoder查看自己的信任列表,有这个内核,可以启动。
签好名后还需要重新编写启动的配置文件,因为需要指定内核,真麻烦
重新配置内核引导
arch的livecd在做,家里突然没网了,下次整