数据结构与算法
文章平均质量分 91
我是8位的
码农一枚
https://iam8bits.blog.csdn.net
展开
-
用解析树计算自定义表达式
不久前,我们遇到了这样的需求:项目方需要对各个业务系统进行监控,如果业务系统的分值低于某个预定的分数,则监控系统会自动为相关负责人发送告警信息。需求看起来并不难,我们把资源的状态由高到低分为致命、严重、警告三个级别,整个业务系统的状态受最严重节点的影响,例如:如果业务系统中有一个资源的状态是致命,那么整个业务系统就是致命。然而需求方有很多项目采用了负载均衡或分布式部署,某个节点宕机并不影响整个系统继续运行,这种简的单规则并不能有效判断系统的整体运行状态。在上图中,虽然可用区A挂.原创 2021-02-18 11:41:51 · 716 阅读 · 0 评论 -
小丫头的超级工程
女儿喜欢搭积木。有一天她问我,能不能用长方形的积木在两张床之间搭一个“跨床大桥”?我随口告诉她不能,但她仍然不断尝试……原创 2019-12-04 10:20:43 · 558 阅读 · 0 评论 -
A*搜索详解(2)——再战觐天宝匣
书接上文。在坦克寻径的,tank_way中,A*算法每一步搜索都是选择F值最小的节点,步步为营,使得寻径的结果是最优解。在这个过程中,查找最小F值的算法复杂度是O(n),这对于小地图没什么问题,但是对于大地图来说,openlist将会保存大量的节点信息,此时如果每次循环仍然使用O(n)复杂度的算法去查找最小F值就是个非常严重的问题了,这将导致游戏运行缓慢。可以针对这一点行改进,在常数时间内查找...原创 2019-04-15 20:33:15 · 483 阅读 · 0 评论 -
退而求其次(1)——随机法
又是一年开学季,来自全国各地的新生聚集到校园里。 入学的第一件事是分配宿舍。为了提升学生住宿的满意度,今年学校特意就学生的一些信息进行了调查,并要求宿管员根据问卷对宿舍进行最合理的分配,力争全体新生都对分配结果满意,问卷如下: 一共收到了数百份问卷,在宿管员的桌子上堆了厚厚的一摞。为了叙述方便,我们把问题缩小,假设只收到了16张问卷,形成了统计数据: 这16个新生被分...原创 2019-04-22 12:24:05 · 1108 阅读 · 0 评论 -
退而求其次(2)——遗传算法
小偷又来了 在搜索的策略(2)——贪心策略中,小偷撬开了一个保险箱,利用贪心法偷走了里面的物品并卖了个好价钱。现在小偷又来了,他光顾了同一个保险箱,保险箱中的物品还和之前一样,有5个物品A,B,C,D,E,它们的体积分别是3,4,7,8,9,价值分别是4,5,10,11,13,只不过每种物品仅有一个。 这次小偷带了一个容量是20的背包,他升级了一下自己的技术,打算使用遗传算法重新编写代...原创 2019-04-28 18:24:52 · 2178 阅读 · 0 评论 -
退而求其次(4)——椭圆中的最大矩形
在椭圆x2+4y2=4 中有很多内接的矩形,这些矩形的边平行于x轴和y轴,找出它们中面积最大的一个。 先作图,椭圆的中心在原点,其内接矩形的中心也在原点。设矩形的其中一点内接椭圆于P(x,y) , P在第一象限: 矩形的两条边长分别是2x和2y,面积是A=4xy 。还知道x和y都在椭圆上,因此问题可以转换为约束条件下的极值:数学方案 最直接的方案是使用拉格朗日乘子...原创 2019-05-08 09:57:13 · 2769 阅读 · 0 评论 -
退而求其次(3)——宿管员的烦恼
书接上文,在《退而求其次(1)——随机法》中宿管员使用了随机法分配宿舍,现在尝试使用遗传算法。顺序编码和初始种群 遗传算法的首要问题是基因编码。对于分宿舍问题,每种分配方案是一个个体,其基因序列的每一个编码代表一个同学,要求处于同一基因序列中的所有基因代码均不能重复,也就是每个同学都是独一无二的。在这种规则下,使用二进制编码就显得笨拙了。一种简单的编码方案是直接使用同学的序号作为基因...原创 2019-05-06 13:40:48 · 798 阅读 · 0 评论 -
网络流(1)——网络、流网络和网络流
在现实世界中,我们的生活受到大量网络的支配。网络流可以表示很多模型,比如管道中的石油、高压线中电流,或者计算机网络中的数据。网络流也可以解决很多问题,比如如何进行道路交通管控,以便有效地缓解早高峰的拥堵;在物流网运输中,在满足供需关系的同时,怎样使渠道成本最低;在轰炸机执行轰炸任务时,怎样才能给敌军补给线造成更严重的打击。这些问题都有现成的网络流算法,别再以为网络流仅仅是网络中的比特流。网...原创 2019-05-16 21:38:10 · 1409 阅读 · 0 评论 -
网络流(3)——找到最小st-剪切
在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网。与此同时,交战双方也想要以最小的代价切断敌军的补给,从而使敌军处于孤立无援的境地。在古今中外的各种重大战役中,上演了一幕幕补给线上的攻防战。甲军的运输路线 假设甲、乙两军正在交战,图8.17是甲军的补给运输网,其中t是甲军的前沿阵地,s是后勤大营,每条边是一条公路,边上的数字代表公...原创 2019-06-12 17:19:35 · 639 阅读 · 0 评论 -
网络流(4)——带有容量的顶点和二部匹配
缓解拥堵的高速公路 又是一个晴朗的假日,居住在A城市的上班族打算到附近的B城市看看自然风光。当大家将车开到高速上时,又一次遇到了毫无悬念的拥堵,两个城市间的收费站成了拥堵的重灾区。下图展示了两个城市间高速公路的网络模型。 图1 每个顶点代表一个收费站,v1是A城市的出口,v6是B城市的入口,边的权重代表高速公路的运力c(v1)~c(v6) 代表每个收费站的容量,该容量和高速公...原创 2019-06-14 15:15:04 · 792 阅读 · 0 评论 -
网络流(2)——用Ford-Fullkerson算法寻找最大流
寻找最大流 在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网,这正好可以用最大流模型解决。如何寻找一个复杂网络上的最大流呢?直觉上的方案 一种直觉上的方案是在一个流网络找到一条从源点到汇点的未充分利用的有向路径,然后增加该路径的流量,反复迭代,直到没有这样的路径为止。广度优先搜索可以在一个流网络中找到这样的路径,这种路径一旦被开...原创 2019-06-10 16:32:36 · 1334 阅读 · 0 评论 -
A*搜索详解(1)——通往基地的最短路线
假设地图上有一片树林,坦克需要绕过树林,走到另一侧的军事基地,在无数条行进路线中,哪条才是最短的? 这是典型的最短寻径问题,可以使用A*算法求解。A*搜索算法俗称A星算法,是一个被广泛应用于路径优化领域的算法,它的行为的能力基于启发式代价函数,在游戏的寻路中非常有用。将地图表格化 A*算法的第一个步是将地图表格化,具体来说是用一个大型的二维列表存储地图数据。这有点类似于像素...原创 2019-04-11 11:17:15 · 1194 阅读 · 0 评论 -
连通问题
写一段程序以实现“给出两点,判断其是否连通”。 这个题目可以应用于很多实际问题,如:两个城市间是否有铁路相连,两个电子元件是否有电路相连,两个终端是否有网络相连……此算法仅仅判断是否连通,如果还要求给出连通的具体路径,难度将陡然增加,并且会把问题引入另一个领域——图。我的第一感觉是把所有节点用一个二维数组存储。在草纸上稍加勾画后便会发现几个问题: 1) 对原创 2018-01-12 10:08:03 · 651 阅读 · 0 评论 -
算法分析(1)——数据的影响和函数的增长
算法分析 在编写代码的某一时刻,自然会产生一段代码比另一段代码运行得更快的思想。算法分析的任务便是尽可能多地发现算法的性能特征,以便让程序员利用这些特征做出正确的选择。在分析之前,首先要了解影响算法性能的因素并排除一些混淆视听的干扰项。数据对性能的影响 也许我们都曾经遇到过这种情况,在某一特定的时刻,算法会运行的十分缓慢,经过排查得知,这是由于一些特殊的数据造成的,于是我们针对这批...原创 2019-02-23 22:53:52 · 776 阅读 · 0 评论 -
递归的逻辑(5)——米诺斯的迷宫
米诺斯迷宫的传说来源于克里特神话,在希腊神话中也有大量的描述,号称世界四大迷宫之一。 米诺斯是宙斯和欧罗巴的儿子,因智慧和公正而闻名,死后成为了冥国的判官。由于米诺斯得罪了海神波塞冬,波塞冬便以神力使米诺斯的妻子帕西法厄爱上了一头公牛,生下了一个牛首人身的怪物米诺陶洛斯。这个半人半牛的怪物不吃其他食物,只吃人肉,因此米诺斯把他关进一座迷宫中,令它无法危害人间。 后来雅典人杀死了米诺...原创 2019-02-19 23:44:55 · 831 阅读 · 0 评论 -
算法分析(3)——冒泡排序真的慢吗?
在初学编程的时候,曾经有两个问题让我感到迷惑,第一个是利用中间变量交换另外两个变量,另一个就是冒泡排序。但是后来发现,冒泡排序几乎是所有排序算法中最简并且容易实现的,实际上许多人了解的第一个排序算法就是冒泡排序。总有人说:“日本人说英语口音太重,听不懂”,就好像没有口音能听得懂一样,人们也经常说冒泡排序效率低下,事实真的如此吗?排序的关注点 在分析排序之前了解一下排序算法的关注点是有...原创 2019-03-05 15:43:47 · 1633 阅读 · 0 评论 -
算法分析(2)——大O和大Θ
当一个软件遇到了性能瓶颈时,首要的改进是软件功能重构,适当删除可能拖垮系统的业务需求。客户对“实时”相当感兴趣,然而又有几个使用者能够真正清楚什么地方应该是实时的?这一点同样体现在其它行业,生厂商想要降低生产成本,相比于对供应商的原料压价,提高生产率、改进制作工艺、优化生产线是更好的办法。 第二个应当改进的是软件结构,包括部署结构、数据存储结构、软件设计结构。软件设计本身就是一个从结构到...原创 2019-03-02 16:17:06 · 1838 阅读 · 0 评论 -
搜索的策略(1)——盲目搜索
早在1952年,克劳德·香农就已经是电子信息界的传奇人物,但是对当时的普通大众来说,他仍然是个陌生人。不过在即将开始的会展后,他就人尽皆知了。 在会议展上,香农展示了一只木制的、带有铜须的玩具老鼠,这只老鼠能够在迷宫中穿梭,最终找到出口处的金属硬币。老鼠是通过试错的方式探索迷宫的,通过胡须,它可以感知是否碰到了走不通的墙壁,如果正对的墙壁走不通,就会退到后一个格子,旋转90°,继续探测下...原创 2019-03-29 17:46:27 · 5560 阅读 · 0 评论 -
搜索的策略(2)——贪心策略
贪心策略 很多时候,我们只需要找到问题的最优解,如果使用盲目搜索策略,就必须先找出所有解,再进一步比较哪个是最优的,当在解空间十分庞大时,难免有些浪费体力的感觉。这时候,不妨试试更高效的贪心策略。 贪心策略也叫贪心算法(greedy algorithm)或贪婪算法,是一种强有力的穷举搜索策略,它通过一系列选择来找到问题的最优解。在每个决策点,它都会做出当时看来是最优的选择,一旦选择后就...原创 2019-03-29 17:47:22 · 1098 阅读 · 0 评论 -
密码疑云 (1)——加密与签名
希尔顿·丘比特先生拿着一张稀奇古怪的纸条找到福尔摩斯,上面画着一行跳舞的小人: 他的妻子看到这些小人就会非常惊恐,而且这些奇怪的小人文字会经常出现在他家的窗台上和工具房的门上,他对此感到相当困扰,因此想求福尔摩斯帮忙解开这个谜团。 福尔摩斯拿着这些画着小人的纸条仔细观察,发现这些小人只有有限的几种,而且某些小人出现的频率远比其他小人更高,于是福尔摩斯得出一个结论——每一个跳舞的...原创 2019-03-22 18:08:44 · 895 阅读 · 0 评论 -
密码疑云 (2)——RSA加密机制需要的数学知识
在公钥密码体制提出不久,人们就找到其中的三种,其中最著名的当属RSA体制。RSA是一种非对称加密体制,在公开密钥加密和电子商业中被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作,RSA就是他们三人姓氏开头字母拼在一起组成的。 RS...原创 2019-03-22 18:10:13 · 757 阅读 · 0 评论 -
密码疑云 (3)——详解RSA的加密与解密
上一篇文章介绍了RSA涉及的数学知识,本章将应用这些知识详解RSA的加密与解密。RSA算法的密钥生成过程 密钥的生成是RSA算法的核心,它的密钥对生成过程如下: 1. 选择两个不相等的大素数p和q,计算出n=pq,n被称为RSA算法的公共模数; 2. 计算n的欧拉数φ(n),φ(n)=(p-1)(q-1); 3. 随机选择一个整数e作为公钥加密密钥指数,1< ...原创 2019-03-22 18:11:05 · 1464 阅读 · 0 评论 -
后缀表达式
我经常不厌其烦地向开发人员强调数据结构的重要性,也经常和团队分享一些常见算法。也许是大家写惯了业务代码,往往对数据结构的知识并不太在意。可不是嘛,只需要玩转QUID就能解决90%以上的问题,还费脑细胞学习基础知识干什么?当然,所有人都会回答“基础知识很重要,数据结构很重要”。然而,当你发现工作几年的开发人员甚至不知道Array和List的区别时,也许会觉得他们当初是在说谎。这是真的,我发现大部分人原创 2017-09-08 11:12:50 · 635 阅读 · 0 评论