本文目錄一覽:
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));
}
}
}
原創文章,作者:OKJW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/147995.html