- 博客(23)
- 收藏
- 关注
原创 最短路: Djikstra
适用于如果存在负边权, 则当前距离dist最小的点, 不一定就是实际离源点最近的点,可能有负边导致其它路径离当前点更近如下图所示, 如果存在负边, y点距离S点最近, 所以选中y点进行松弛,贪心思想当边权非负,离起点S最近的点,不能被更新, 如果在中间加入一个点,则长度必然大于当前距离在稀疏图中.使用二叉堆实现的 Dijkstra 算法较 Bellman-Ford 算法具有较大的效率优势;而在稠密图中,这时候使用暴力做法较二叉堆实现更优。
2024-09-20 16:15:02
1051
原创 进程创建-fork
只是将Hello通过write写到缓冲区, 并没有打印, 直到进程结束时才清空缓冲区打印。终端默认使用行缓冲, 读到换行时就清空缓冲区并将缓冲区内容写到终端。最终程序运行的结果就是叶子结点的进程并发执行最后一条。当stdout重定向时, 使用全缓冲.结果: 6个Hello。结果: 8个Hello。
2024-05-13 17:09:17
452
原创 哲学家就餐问题
在一个圆桌上坐着五位哲学家,每个哲学家面前有一个碗装有米饭的碗和一个筷子。哲学家的生活包括思考和进餐两个活动。当一个哲学家思考时,他不需要任何资源。当他饿了时,他试图拿起两只相邻的筷子来吃饭。由于碗和筷子不能被共享,因此必须找到一种方法来确保哲学家能够安全地进餐,即不会发生死锁(所有哲学家都在等待筷子)也不会发生饥饿(某些哲学家永远无法拿起筷子)限制最多只能4人同时上桌, 则可以保证至少有一个人可以同时拿起两根筷子。规定每个人, 先拿编号小的筷子, 再拿编号大的筷子。
2024-05-12 22:17:25
394
原创 条件变量解决同步问题之打印金鱼
本代码为老师上课演示条件变量解决同步问题示例(本人只做记录与分享)本人未使用老师封装的POSIX线程库, 直接在单文件中调试并注释。
2024-05-12 18:07:40
237
原创 基于POSIX的信号量模拟DAG上的并行计算的同步问题
自己增加了随机生成DAG(有向无环图)(不保证连通)数据进行测试。本代码主题借鉴nju的jyy老师的代码。运行打印结果即为并行计算DAG的拓扑序。
2024-05-12 16:43:39
255
原创 银行家算法简易实现
程序可以针对不同进程的请求进行判断,并决定是否满足其需求。算法程序需要设计合理的数据结构,对资源情况、进程相关数据进行存储。实现银行家算法的核心: 安全性算法, 银行家算法的请求判断。生成可能会产生死锁的数据, 但是没有调度出死锁的情况。随机生成数据, 并校验数据是否会产生死锁问题。生成可能会产生死锁的数据, 调度出死锁的情况。打印银行家算法一次接受的请求向量序列。打印每个线程的合法请求向量序列。保证没有死锁的数据, 运行结果。
2024-05-11 17:29:40
273
原创 基于POSIX标准库的读者-写者问题的简单实现
对共享文件做P操作的, 所以一个读线程完成读操作后会立即再次对文件发起读请求. 从而使得可能在后续读线程就绪前, 就准备好的写线程一直被阻塞. 从而引起了这些写线程出现饥饿现象.当然, 如果线程中不加入死循环, 则每个线程只对文件操作一次, 则所有的线程都有机会操作文件.此时写线程只会饥饿, 但不至于饿死. 而加入死循环, 可能会导致线程饿死.前面读者优先的实现问题在于: 当读线程在占用文件时, 其它读线程直接进入临界区, 则不被阻塞, 仅有后续的写线程被阻塞。, 表示正在对文件进行读操作的线程的数量.
2024-05-07 17:02:26
1271
原创 字典树 Trie
Trie是一种存储字符串集合的树形数据结构,我们可以将一个字符串集合保存到Trie里, 并快速地进行字符串查找。在Trie树里, 除了根节点,每个节点可以存储一个字符,从根节点到树上某一节点的路径代表一个字符串。在向字典树中添加字符串时,如果一个字符串在某个节点结束,我们可以给这个节点打上一个标记(结尾或出现次数)。这样在后续访问时就可以知道到此节点为止是一个完成的字符串。当然, 也可以在路径上的任何地方打标记, 进行信息统计。沿路径记录信息是否为单词结尾是否为前缀是否是某个数的位注意。
2023-11-04 21:10:16
140
原创 字符串-最小表示法
因为不知道要比较A集合中的哪一个和B集合中的哪一个字符串, 如果暴力的匹配集合A与集合B中的字符串, 则时间复杂度为。b 是 a 的最小循环覆盖,当且仅当 a 是通过 b 复制多次并连接后得到的字符串的。,且 b 是满足条件的字符串中长度最小的。因为一个字符串的最小表示是唯一的, 所以只需比较最小表示是否相等就可以了。给你一个字符串 a,你需要求出这个字符串的字典序最小的最小循环覆盖。如果与a循环同构的字符串集合为A, 与b循环同构的字符串集合为B。)的位置所对应的循环同构最是字符串的最小表示。
2023-11-04 21:04:30
208
原创 KMP算法
KMP每次通过基于上个位置求出的nxt值, 来节省计算当前位置的nxt值的时间KMP求出的是串S最长的公共前后缀, 但S仍然有其它公共前后缀, 可以对前缀不断迭代nxt求出它们的长度, 所以我们可以求出一个公共前缀集合, 包括最长的公共前后缀, 和最短的公共前后缀。
2023-09-02 17:08:25
135
原创 Ubuntu下使用nslookup查询DNS记录
要查询指定域名的DNS服务器信息可以使用whois服务器查询: https://www.godaddy.com/en-au/whois。, 则查询指定的DNS服务器的信息及记录。+ 记录类型(a, ns, mx)查询DNS服务器指定类型的记录。, 则默认查询本地DNS服务器。安装nslookup。不加DNS服务器名称。添加DNS服务器名称。
2023-08-24 11:45:27
1347
1
原创 Lucas定理
要结果是1, 则n的每一位都要大于等于m的每一位, 即m是1的为n是1, m是0的位,n也是1, 满足这样的n和m相与结果肯定是m。, 中间的组合数分子都有p, 其余部分整体式都是整数, 即整体是p的k倍, 所以mod p 为 0。, 则a+b在p进制下不进位, 因为a的p进制加上b的p进制后仍然每一位都大于a, 则未发生进位。利用公式(3), 即将p的次幂移到括号内的项的指数上去。例如 n = 13, m = 5, p = 3。将n写为p进制, 所以在模p意义下。n, m的p进制形式为。
2023-08-17 15:06:26
106
1
原创 扩展KMP算法
如果要用哈希统计从 s 中每一位字符开始最多可以匹配多少位 p 中的字符,需要用到二分查找,此时时间复杂度为Onlogmm,其中 n 表示 s 的长度,m 表示 p 的长度。扩展KMP(也称为Z algorithm)能够以的时间复杂度求出一个字符串 s 和它的任意的的长度。注意其与KMP算法求出的 next 数组的区别,一个是以字符s[i]结束,另一个是从字符s[i]开始。
2023-08-17 12:02:50
653
1
原创 Manacher算法
如果一个字符串从左往右看和从右往左看是一样的,我们把它叫做回文串回文串可以按长度的奇偶性分为的回文串和的回文串。最长回文子串(Longest palindromic substring)问题指的是对于任意一个给定的字符串,我们要求出这个字符串中最长的回文子串。我们很容易就可以想到最暴力的做法:枚举所有子串,然后检查当前枚举到的子串是否为回文串,最后从符合条件的子串中找出最长的就可以啦!暴力的时间复杂度是On3的, 枚举起点,终点, 判断回文串都是O(n)
2023-08-15 19:10:00
104
原创 Codeforces Alpha Round #20 (Codeforces format) C. Dijkstra?
堆优化的djikstra模板题
2022-07-28 21:59:32
251
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人