- 博客(13)
- 收藏
- 关注
原创 关于nmap -O扫描中出现索尼手机的一份调研
做网络安全实验的时候发现nmap扫描操作系统的结果中出现了索尼爱立信u8i手机,大为震惊,探究之后发现竟然是历史遗留问题。
2022-10-13 13:48:05
1760
原创 图的m着色问题
图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。 通过回溯法,不断的为每一个节点着色,在前面n-1个节点都合法的着色之后,对第n个节点进行着色,此时枚举可用的m个颜色,通过和第n个节点相邻的节点的颜色,来判断这个颜色是否合法,如果找到一种颜色使得第n个节点能够着色,那么说明m种颜色的方案是可行的。 void Backtrack(int c) { if (c >
2021-05-31 15:54:02
164
原创 最优前缀码
1.问题 [描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 构造最优前缀码的贪心算法就是哈夫曼算法 核心设计 void CharSetHuffmanEncoding(HFMT T, HFMCode H) { int a, b; char c[N + 1]; int s; c[N] = '\0'; getchar(); for (int i = 0; i < N; i++) { H[i].ch = ge
2021-05-24 21:05:20
231
原创 LCS最长公共子序列
求解X和Y的最长公共子序列 如果xn=ym,则说明该元素一定位于公共子序列中,所以现在只需要找到LCS(xn-1,ym-1) 如果xn不等于ym,则说明最后一个元素不可能是最长公共子序列中的元素。 如果是LCS(Xn-1,Ym),则在(x1,x2,…x(n-1)) 和 (y1,y2,…yn)中找最长公共序列。 如果是LCS(Xn,Ym-1),则在(x1,x2,…xn) 和 (y1,y2,…y(n-1))中找最长公共序列。 比较上面两个求出的公共子序列,最长的那个对应的,就是 LCS(X,Y)。 算法
2021-05-10 16:20:24
152
原创 矩阵链乘法实验
1.蛮力法: 枚举所有可能的乘法次序,针对每种次序计算基本运算的次数,从中找出具有最小运算次数的乘法次序,每一种乘法次序对应了一种在n个项中加n-1对括号。 2.动态规划法: Ai…j:表示矩阵链相乘的子问题Ai,Ai+1…Aj; M[i…j]:表示得到乘积Ai…j所用的最少基本运算次数; 假定,最后一次相乘发生在矩阵链Ai…kAk+1…j之间m[i,j]=min{m[i,k]+m[k+1,j]+Pi=1PkPj}满足优化原则。 也就是说,m[i,j]最小值时,m[i,k],m[k+1,j]也是最小的。 .
2021-04-26 15:48:57
225
原创 m投资问题
1.问题 [描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 设m元钱,n项投资,函数f(x) 表示将x元投入第i项项目所产生的效益,i=1,2,…n. 问:如何分配这m元钱,使得投资的总效益最高? 2.设计 该算法满足优化原则。即一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。 问题的数学语言为求max{f1(x1)+f2(x2)+…+fn(xn)} 其中x1+x2+…+xn=m,xi为正整数 设:第k步的时候一共分配了x万元,其中分配给第k
2021-04-25 16:35:17
453
原创 2021-04-19 寻找第k小元素
1.问题 用特定的分治策略,选第k小的元素。 设 L是n个元素的集合,从 L 中选取第k小的元素,其中 1<=k<=n.这里的第k小元素是指,当 L 按从小到大排好序之后,排在第k个位置的元素。 2.解析 以S中的某个元素m作为划分标准,将S划分为两个数组S1和S2,把这个数组中<m的数字都放入S1数组中,把这个数组中>m*的都放入S2数组中。 若k<|S1|,则原问题归纳为在数组S1中找第k小的子问题。 若k=|S1|+1,则m*就是我们所要找的第k小元素。 若k>|S
2021-04-19 16:15:20
451
原创 最近对问题
1.问题 [描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] 在二维平面上的n个点中,如何快速的找出最近的一对点。 2.解析 我们先考虑一维情形,即所有的点都在x轴上,x轴上某个点m将集合划分为s1和s2,并且两个集合的点数都是相同的,递归的求解两个子集最近对的点,(p1,p2)和(q1,q2)。如果,两个集合的最近点对都在子集s1和s2中,则 d = min{ |p1-p2| , |q1-q2| } 如果,最近点对分别在s1和s2中,则一定是(p3,q3)。|p3-q3|<
2021-04-12 16:07:21
224
原创 二分 归并 排序
问题:二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k 分析:二分归并排序,本质上是一种归并排序算法,不断将一个数组分为左右两部分,直到不可分,然后再将两两合并直到完整。 1.分解n个元素直到组成n/2组数组。 2.使用归并排序递归排序两个子序列。 3.合并已经排序的子序列。 核心代码如下 void Merge(int A[], int p, int q, int r) { int* L, * R, x, y; x = q - p + 1, y = r - q; L = (i
2021-03-29 16:20:41
132
原创 两种查找方法
1.问题 写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。 2.解析 [问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档] 1.顺序查找,最简单最经典的思路,从下标0开始,不断与需要查找的数字进行比较,最差n次比较就能得到结果。 2.二分查找,因为是顺序数组,所以每次和中间那个数进行比较,如果需要查找的数字比中间那个小,则再次与左半边中间的数字比较,不断重复,直到
2021-03-22 15:55:22
329
原创 Dijkstra and Floyd
Dijkstra算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。使用了贪心策略,创建数组A,保存原点到其他顶点的距离(不能直接到达的路径长度为无穷大),创建数组B,以原点为起点,保存已经找到的最短路径的顶点。然后从A数组选择最小值作为原点到该值对应顶点的最短路径,并且把该点加入到数组B中。接着查看该点是否可以到达其他顶点,并比较该点到其他顶点的路径长度是否比原点直接到达短,如果是,则替换这些顶点在数组A中的值。重读以上过程,直到数组B包含所有顶点。 #defin
2021-03-21 13:39:56
107
原创 最小生成树构造
1.prim算法:随意选取一个点作为起始点,遍历点连接的边,选择权值最小的边,把该边连接的点加入集合,然后以改点为原点,重复之前的动作,但是不能构成回路,直到所有点被联通 2.Kruskal算法:把所有边按照权值大小从小到大排序,然后遍历判断,如果这个边不与之前选的边组成回路,则作为最小生成树的一部分,直到筛选出顶点数目减1的边,即构成最小生成树。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h>
2021-03-12 20:12:59
440
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅