缩短算法
‘壹’ 计算机网络的最短路径算法有哪些对应哪些协议
用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:
Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介绍其中的三种。
最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。
算法具体的形式包括:
确定起点的最短路径问题:即已知起始结点,求最短路径的问题。
确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。
全局最短路径问题:求图中所有的最短路径。
Floyd
求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题。
Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2)。
Floyd-Warshall的原理是动态规划:
设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度。
若最短路径经过点k,则Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路径不经过点k,则Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。
在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
Floyd-Warshall算法的描述如下:
for k ← 1 to n do
for i ← 1 to n do
for j ← 1 to n do
if (Di,k + Dk,j < Di,j) then
Di,j ← Di,k + Dk,j;
其中Di,j表示由点i到点j的代价,当Di,j为 ∞ 表示两点之间没有任何连接。
Dijkstra
求单源、无负权的最短路。时效性较好,时间复杂度为O(V*V+E),可以用优先队列进行优化,优化后时间复杂度变为0(v*lgn)。
源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)。
当是稀疏图的情况时,此时E=V*V/lgV,所以算法的时间复杂度可为O(V^2) 。可以用优先队列进行优化,优化后时间复杂度变为0(v*lgn)。
Bellman-Ford
求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。
Bellman-Ford算法是求解单源最短路径问题的一种算法。
单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。
与Dijkstra算法不同的是,在Bellman-Ford算法中,边的权值可以为负数。设想从我们可以从图中找到一个环
路(即从v出发,经过若干个点之后又回到v)且这个环路中所有边的权值之和为负。那么通过这个环路,环路中任意两点的最短路径就可以无穷小下去。如果不处理这个负环路,程序就会永远运行下去。 而Bellman-Ford算法具有分辨这种负环路的能力。
SPFA
是Bellman-Ford的队列优化,时效性相对好,时间复杂度O(kE)。(k< 与Bellman-ford算法类似,SPFA算法采用一系列的松弛操作以得到从某一个节点出发到达图中其它所有节点的最短路径。所不同的是,SPFA算法通过维护一个队列,使得一个节点的当前最短路径被更新之后没有必要立刻去更新其他的节点,从而大大减少了重复的操作次数。
SPFA算法可以用于存在负数边权的图,这与dijkstra算法是不同的。
与Dijkstra算法与Bellman-ford算法都不同,SPFA的算法时间效率是不稳定的,即它对于不同的图所需要的时间有很大的差别。
在最好情形下,每一个节点都只入队一次,则算法实际上变为广度优先遍历,其时间复杂度仅为O(E)。另一方面,存在这样的例子,使得每一个节点都被入队(V-1)次,此时算法退化为Bellman-ford算法,其时间复杂度为O(VE)。
SPFA算法在负边权图上可以完全取代Bellman-ford算法,另外在稀疏图中也表现良好。但是在非负边权图中,为了避免最坏情况的出现,通常使用效率更加稳定的Dijkstra算法,以及它的使用堆优化的版本。通常的SPFA。
‘贰’ C语言求解:筛选法输出一组素数序列如何优化算法缩短时间
你试试这个看行不行——
//#include "stdafx.h"//vc++6.0加上这一行.
#include "stdio.h"
#include "stdlib.h"
void prime(int m,int n){
char *p;
int i,j,k;
if((p=(char *)malloc(n+1))==NULL){
printf("Application memory failure...\n");
exit(0);
}
for(n++,i=2;i<n;p[i++]='a');
for(k=0,i=2;i<n;i++){
if(p[i]){
for(j=i+i;j<n;j+=i)
if(!(j%i)) p[j]=0;
if(i>=m) printf(++k%10 ? "%d\t" : "%d\n",i);
}
}
free(p);
}
void main(void){
int m,n;
while(m!=EOF && n!=EOF){
while(1){
printf("Type m & n(0<=m<=n<=500000)\n");
scanf("%d%d",&m,&n);
if(0<=m && m<n && n<=500000)
prime(m,n);
else if(m==EOF || n==EOF) break;
else printf("Error!redo: ");
printf("\n\n");
}
}
}
不知道你是用什么语言写:
下面是c#的代码:DateTime.Now.ToShortDateString()
如果是别的日期形式你用:DateTime.Parse(DateTimestring).ToShortDateString()转换成日期形式再存。
附上所有日期形式:
DateTime dt = DateTime.Now;
// Label1.Text = dt.ToString();//2005-11-5 13:21:25
// Label2.Text = dt.ToFileTime().ToString();//127756416859912816
// Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816
// Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25
// Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日
// Label6.Text = dt.ToLongTimeString().ToString();//13:21:25
// Label7.Text = dt.ToOADate().ToString();//38661.5565508218
// Label8.Text = dt.ToShortDateString().ToString();//2005-11-5
// Label9.Text = dt.ToShortTimeString().ToString();//13:21
// Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25
// 2005-11-5 13:30:28.4412864
// Label1.Text = dt.Year.ToString();//2005
// Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00
// Label3.Text = dt.DayOfWeek.ToString();//Saturday
// Label4.Text = dt.DayOfYear.ToString();//309
// Label5.Text = dt.Hour.ToString();//13
// Label6.Text = dt.Millisecond.ToString();//441
// Label7.Text = dt.Minute.ToString();//30
// Label8.Text = dt.Month.ToString();//11
// Label9.Text = dt.Second.ToString();//28
// Label10.Text = dt.Ticks.ToString();//632667942284412864
// Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864
// Label1.Text = dt.ToString();//2005-11-5 13:47:04
// Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04
// Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
// Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
// Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
// Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04
// Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
// Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
// Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
// Label10.Text = dt.CompareTo(dt).ToString();//0
//// Label11.Text = dt.Add(?).ToString();//问号为一个时间段
// Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False
// Label2.Text = dt.Equals(dt).ToString();//True
// Label3.Text = dt.GetHashCode().ToString();//1474088234
// Label4.Text = dt.GetType().ToString();//System.DateTime
// Label5.Text = dt.GetTypeCode().ToString();//DateTime
// Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25
// Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06
// Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月
// Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日
// Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05
// Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05
// Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日
// Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日
// Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06
// Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06
// Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT
Label1.Text = string.Format("{0:d}",dt);//2005-11-5
Label2.Text = string.Format("{0:D}",dt);//2005年11月5日
Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23
Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23
Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23
Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23
Label7.Text = string.Format("{0:M}",dt);//11月5日
Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23
Label10.Text = string.Format("{0:t}",dt);//14:23
Label11.Text = string.Format("{0:T}",dt);//14:23:23
Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23
Label14.Text = string.Format("{0:Y}",dt);//2005年11月
Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23
Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt);
‘肆’ 影响算法执行时间的因素主要有哪些
影响算法执行时间的因素包括:
1、算法本身选用的策略;
2、问题的规模;
3、书写程序的语言;
4、编译产生的机器代码质量;
5、机器执行指令的速度等。
为便于比较算法本身的优劣,应排除其它影响算法效率的因素。从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量。
(4)缩短算法扩展阅读:
缩短算法时间的方法:
1、选择合理的存储结构。
数据的存储结构,分为顺序存储结构和链式存储结构。顺序存储结构的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;链式存储结构则是借助指示元素存储地址的指针表示数据元素之间的逻辑关系。
2、使用直接初始化。
与直接初始化对应的是复制初始化。
3、减少除法运算的使用。
无论是整数还是浮点数运算,除法都是一件运算速度很慢的指令,在计算机中实现除法是比较复杂的。所以要减少除法运算的次数。
‘伍’ 缩我短链接的缩短算法是什么这些短网址的算法都是统一的吗
短链接的核心算法一般采用:自增序列算法或者自减序列算法。服务器接收到一个网址时,给这个网址分发一个id,这个id是redis缓存中的一个自增序列,保证了每一个存储的网址的id都是唯一的。比如当一个链接提交时,给这个链接分配一个唯一标识id:0,再提交一个链接过来时,给后面这个链接分配一个唯一标识id:1,以此类推。市面上短网址算法都差不多出自于此。
‘陆’ 如何缩短运行时间,关于一个台阶问题的小小算法!
递推,f(n)=f(n-1)+f(n-2),初始值f(1)=1f(2)=2。或者记忆化搜索。n很大时用高精度。手机打的,很累啊
‘柒’ 短地址的算法原理
现在的短地址网站基本都是通过ASP或者PHP转向来实现网址缩短。 1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址; a-z,A-Z,0-9,这62位取6位组合,可产生500多亿个组合数量。把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
‘捌’ 什么是最短作业优先调度算法
最短作业优先调度算法是对预计执行时间短的作业(进程)优先分派处理机,通常后来的短作业不抢先正在执行的作业。这种算法称为这种算法会根据作业长短,也就是作业服务时间的多少来调度作业,服务时间短的会被优先调度执行。
这种算法的优点是比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间;提高系统的吞吐量。
算法的缺点在于对比较长的作业可能长期得不到调度,对长作业不利;还有就是作业的服务时间是用户向系统提交作业时设定好的,难免有些用户为了让自己的作业先调度,会把服务时间缩短,也就是有人为的因素在里面。
‘玖’ 数据压缩
数据压缩技术主要研究数据的表示、传输和转换方法,目的是减少数据所占据的存储空间和缩短数据传输时所需要的时间。
衡量数据压缩的3个主要指标:一是压缩前后所需的信息存储量之比要大;二是实现压缩的算法要简单,压缩、解压缩速度快,要尽可能做到实时压缩和解压缩;三是恢复效果要好,要尽可能完全恢复原始数据。
数据压缩主要应用于两个方面。一是传输:通过压缩发送端的原始数据,并在接收端进行解压恢复,可以有效地减少传输时间和增加信道带宽。二是存储:在存储时压缩原始数据,在使用时进行解压,可大大提高存储介质的存储量。
数据压缩按照压缩的失真度分成两种类型:一种叫作无损压缩,另一种叫作有损压缩。
无损压缩是指使用压缩后的数据进行重构(或者叫作还原、解压缩),重构后的数据与原来的数据完全相同;无损压缩用于要求重构的信号与原始信号完全一致的场合。一个很常见的例子是磁盘文件的压缩。根据目前的技术水平,无损压缩算法一般可以把普通文件的数据压缩到原来的1/4~1/2。一些常用的无损压缩算法有霍夫曼(Huffman)算法、算术算法、游程算法和LZW(Lenpel-Ziv & Welch)压缩算法。
1)霍夫曼算法属于统计式压缩方法,其原理是根据原始数据符号发生的概率进行编码。在原始数据中出现概率越高的符合,相应的码长越短,出现概率越少的符合,其码长越长。从而达到用尽可能少的符号来表示原始数据,实现对数据的压缩。
2)算术算法是基于统计原理,无损压缩效率最高的算法。即将整段要压缩的数据映射到一段实数半封闭的范围[0,1)内的某一区段。该区段的范围或宽度等于该段信息概率。即是所有使用在该信息内的符号出现概率全部相乘后的概率值。当要被编码的信息越来越长时,用来代表该信息的区段就会越来越窄,用来表示这个区段的位就会增加。
3)游程算法是针对一些文本数据特点所设计的压缩方法。主要是去除文本中的冗余字符或字节中的冗余位,从而达到减少数据文件所占的存储空间。压缩处理流程类似于空白压缩,区别是在压缩指示字符之后加上一个字符,用于表明压缩对象,随后是该字符的重复次数。本算法具有局限性,很少单独使用,多与其他算法配合使用。
4)LZW算法的原理是用字典词条的编码代替在压缩数据中的字符串。因此字典中的词条越多,压缩率越高,加大字典的容量可以提高压缩率。字典的容量受计算机的内存限制。
有损压缩是指使用压缩后的数据进行重构,重构后的数据与原来的数据有所不同,但不影响人对原始资料表达的信息造成误解。有损压缩适用于重构信号不一定非要和原始信号完全相同的场合。例如,图像和声音的压缩就可以采用有损压缩,因为其中包含的数据往往多于我们的视觉系统和听觉系统所能接收的信息,丢掉一些数据而不至于对声音或者图像所表达的意思产生误解,但可大大提高压缩比。
‘拾’ 求c#的字符串压缩算法 最好提供代码!
字符串如果不大的话,就不要压缩了,反而会变大的。不然GZipStream也能满足要求了,部署也方便。