本文目录一览:
Dijkstra算法时间复杂度
我们可以用大O符号将Dijkstra算法的运行时间表示为边数m和顶点数n的函数。
Dijkstra算法最简单的实现方法是用一个链表或者数组来存储所有顶点的集合Q,所以搜索Q中最小元素的运算(Extract-Min(Q))只需要线性搜索Q中的所有元素。这样的话算法的运行时间是O(n2)。
对于边数少于n2稀疏图来说,我们可以用邻接表来更有效的实现Dijkstra算法。同时需要将一个二叉堆或者斐波纳契堆用作优先队列来寻找最小的顶点(Extract-Min)。当用到二叉堆的时候,算法所需的时间为O((m+n)log n),斐波纳契堆能稍微提高一些性能,让算法运行时间达到O(m + n log n)。相关问题和算法
在Dijkstra算法的基础上作一些改动,可以扩展其功能。例如,有时希望在求得最短路径的基础上再列出一些次短的路径。为此,可先在原图上计算出最短路径,然后从图中删去该路径中的某一条边,在余下的子图中重新计算最短路径。对于原最短路径中的每一条边,均可求得一条删去该边后子图的最短路径,这些路径经排序后即为原图的一系列次短路径。
OSPF(open shortest path first, 开放最短路径优先)算法是Dijkstra算法在网络路由中的一个具体实现。
与Dijkstra算法不同,Bellman-Ford算法可用于具有负花费边的图,只要图中不存在总花费为负值且从源点 s 可达的环路(如果有这样的环路,则最短路径不存在,因为沿环路循环多次即可无限制的降低总花费)。
与最短路径问题有关的一个问题是旅行商问题(traveling salesman problem),它要求找出通过所有顶点恰好一次且最终回到源点的最短路径。该问题是NP难的;换言之,与最短路径问题不同,旅行商问题不太可能具有多项式时间算法。
如果有已知信息可用来估计某一点到目标点的距离,则可改用A*算法,以减小最短路径的搜索范围。
高德的“一流技术”
我相信大部分测绘地理信息人对完成互联网改造之后的高德都充满了好奇,在业务上毫无疑问他们需要满足更多的流量,更快的迭代,更智能的服务,那蜕变后的高德是如何用互联网的思维去为大众做更好的空间位置服务呢?(来自云栖大会高德技术专场)
1.视觉连接
空间数据的价值在于可以将人和真实世界进行连接 ,而传统测绘主要还是依靠人进行空间数据的实地采集和内业成图,无论从哪个角度来说,都是个劳动力密集型的行业,从我们国家的测绘体系上来说有测绘司、测绘局、测绘院、测绘中心、测绘站,也正是依靠这个庞大的体制才能保证国家对于空间数据的实时需求,对比一下可想而知高德在数据上的压力有多大,完全依靠人力肯定是不行的,这样成本太高,那如何破解这个难题呢?答案是“机器视觉”。
目前图像采集已经变成当下测绘的一种常用的手段,也是地图数据的一个主要来源,通过使用机器视觉的方法可以从这些海量的图像中自动化获取结构化的路牌和POI信息用于地图制作,但是机器的自动识别又无法做到100%正确,这就需要人工对结果进行进一步修正,最后制作成为标准的地图服务。
对于传统的POI、地名地址采集,我们依然使用的是人工的普查,这个成本很高也无法满足快速更新的要求,同时数据的质量也不高,对于地名或者实体数据的采集,通常使用GPS进行位置的采集,但是由于GPS数据本身的不准确性,导致根据位置点采集的数据根本无法和建筑物数据进行准确叠加,所以导致实体化的过程无法快速的自动化,而高德采用图像识别进行位置以及内容标识的检测是一个很值得借鉴的方法。
视觉一方面可以用于进行数据提取,另外一个用处就是辅助定位和导航,“二维地图+三维路口+语音提示”三套件已经非常成熟了,但是在实际使用中对于比较复杂的路口,现有的交互方式还是不够直观,比较好的方式应该是采用AR增强的手段,一方面就是将导航信息叠加到摄像头上,这样对于使用者来说就比较直观了;另外一个方面就是通过视觉计算可以进行道路信息的检测比如周围车辆,车道信息等;如下就是他们相应的成果:
但是AR导航也存在相应的难点就是导航场景一般只有单相机,这和目前无人驾驶遇到的困境是一样的,如果想达到比较好的效果就需要更昂贵设备的支持,但是只有廉价化的东西才满足普适化的需要,这是一个矛盾,但是目前无人驾驶行业也在 探索 廉价化的方案,我相信不久这个问题也可以得到突破;另外一点就是视觉计算也需要比较强的算力,但是目前的手机芯片还无法满足这个要求,随着NPU芯片的发展这个问题应该会慢慢得到解决。
总的来说,AR导航并不是个很新鲜的东西,这个很多年前一些车厂解决方案的厂商就在 探索 这个问题,也做出了很多专有的HUD设备,效果也更好,但是这种方案需要专业设备的支持,但是如果能用一个手机就解决这个问题那肯定是极好的。
2.智能的路径规划
路径规划是一个历久弥新的研究方向,在专业的学习中路径规划就是Dijskra算法,但是在实际的过程中对路径规划面临的现状是比较苛刻的: 第一、中国有巨大的路网规模 ,在这么大路径中计算合适的路径,是很耗时的; 第二、路网的属性信息变化很快 ,比如各个城市存在的分时分道路的限行信息;第 三、路网实时更新 ,就是需要根据道路的实时交通状况来进行路径规划;那如何保证能够在很短的时间内能给出一个合适的规划路径呢?
高德采用的方法就是分区块执行路径规划 ,这里面的区块就是行政区划,可以是 省、市、县、镇、村 ,分区块执行有个好处就是可以将一个复杂的问题拆分成若干个不相关的小问题,然后并行执行,然后再将分块的执行结果进行合并,其实问题分割还带来一个好处就是使得预处理成为可能,对无数的路径预处理是不现实的,但是对于局部高频的路径进行预处理是可行的,所以结合预处理最终实现路径规划的秒级响应是可行的。
3.全场景定位
高德在进行定位方案的选型的时候就比较明确两点: 第一、卫星是不精确、非可靠的;第二、只能使用手机设备就可以获得的方案就进行做定位 ;所以高德在选择方案的时候,选择了如下四种组合定位的方法: 几何法、指纹法、推算法、识别法,其实也就是组合定位 。
其中比较有意思的一个场景是,高德如何做到通过wifi/基站/蓝牙来增强定位的?他们自己构建了一个数据训练的闭环,就是在进行定位的时候,用户会向后台发送手机端扫描到的wifi和基站列表,这样后台通过大数据训练就会得到wifi的近似位置,这样叠合wifi信号的强度就可以用来进一步修正后续请求的定位结果,这样就会形成一个正反馈的循环,使用高德的人越多,wifi数据就越丰富,这样辅助定位的精度就会越高。
另外一点值得一说的就是,未来5G的发展会加速室内定位的发展,高频的5G信号本身是可以进行载波测距的,而5G由于本身信号传播的问题,在实际部署的时候一定会布设到室内,这样就可以采用和卫星定位一样的方法基于5G进行位置结算,因而5G会成为继蓝牙、WIFI、UWB之后的廉价和普适的解决方案。
4.时空大数据中台
这个时空大数据不同于政府发文的“时空大数据云平台”,高德提的时空大数据的基础在于高德积累了大量的动态数据和静态数据,动态数据就是终端收集的出行数据,而静态数据就是高德自己采集的大量的道路和POI数据。
那如何管理时空大数据以及时空大数据可以优化哪些内容呢?在管理时空大数据方面,采用了数据仓库的建模和管理模式,分为ODS、DWD以及DWS。基于这一套分层的数据管理,每一层都会进一步对数据进行加工,比如 数据收容统一标准、数据建模统一、平台管理统一、权限管理统一 。通过这四步统一之后就可以实现GPS数据的清晰、修正和打分,最终得到高品质的点位和路径,这样就可以进一步的服务业务优化,即点位更新以及道路新增检测,目前POI的问题就是位置不准和存在过期问题,不准确的问题可以通过海量导航的到达点来计算,过期问题可以通过区域推演来进行推测。关于道路更新这个思路非常类似于uber使用出租车数据进行地图道路缺失的检测然后指导更新,高德的思路很类似,不再展开赘述,详情请移步我的另外一篇文章《震惊!Uber竟然用这种方法更新地图数据~》
整个分享过程还是干货满满的,在内容的高度上,用他们自己的话来说,高德的技术绝对是业内一流的。虽然都是折腾空间数据那点事,但是让我们这种长期从事行业解决方案的人感觉自己在工程上确实离一流的技术越来越远了。好在高德能够以一种非常开放的姿态将自己的研究分享出来,也让我们时刻能够了解头部企业的技术动态,反哺到行业中去。
关于nodejs 怎么实现 crypto des加密
就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56bits。
非对称式加密:
就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。
加密为系统中经常使用的功能,node自带强大的加密功能Crypto,下面通过简单的例子进行练习。
1、加密模块的引用:
var crypto=require('crypto');
var $=require('underscore');var DEFAULTS = {
encoding: {
input: 'utf8',
output: 'hex'
},
algorithms: ['bf', 'blowfish', 'aes-128-cbc']
};
默认加密算法配置项:
输入数据格式为utf8,输出格式为hex,
算法使用bf,blowfish,aes-128-abc三种加密算法;
2、配置项初始化:
function MixCrypto(options) {
if (typeof options == 'string')
options = { key: options };
options = $.extend({}, DEFAULTS, options);
this.key = options.key;
this.inputEncoding = options.encoding.input;
this.outputEncoding = options.encoding.output;
this.algorithms = options.algorithms;
}
加密算法可以进行配置,通过配置option进行不同加密算法及编码的使用。
3、加密方法代码如下:
MixCrypto.prototype.encrypt = function (plaintext) {
return $.reduce(this.algorithms, function (memo, a) {
var cipher = crypto.createCipher(a, this.key);
return cipher.update(memo, this.inputEncoding, this.outputEncoding)
+ cipher.final(this.outputEncoding)
}, plaintext, this);
};
使用crypto进行数据的加密处理。
4、解密方法代码如下:
MixCrypto.prototype.decrypt = function (crypted) {
try {
return $.reduceRight(this.algorithms, function (memo, a) {
var decipher = crypto.createDecipher(a, this.key);
return decipher.update(memo, this.outputEncoding, this.inputEncoding)
+ decipher.final(this.inputEncoding);
}, crypted, this);
} catch (e) {
return;
}
};
js组合算法代码转成java代码
不必转换,我早已熟透组合排列算法:java如下
import java.util.Arrays;
import java.util.LinkedList;
public class Guy
{
public static void recursionSub ( LinkedListint[] list, int count, int[] array, int ind, int start, int... indexs )
{
start++;
if (start count - 1)
{
return;
}
if (start == 0)
{
indexs = new int[array.length];
}
for ( indexs = ind; indexs array.length; indexs++ )
{
recursionSub (list, count, array, indexs + 1, start, indexs);
if (start == count - 1)
{
int[] temp = new int[count];
for ( int i = count - 1; i = 0; i-- )
{
temp[start - i] = array[indexs[start - i]];
}
list.add (temp);
}
}
}
public static void main ( String[] args )
{
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
LinkedListint[] list = new LinkedListint[] ();
recursionSub (list, 3, array, 0, -1);
for ( int[] strings : list )
{
System.out.println (Arrays.toString (strings));
}
}
}