當前位置:首頁 » 操作系統 » 實現已有演算法

實現已有演算法

發布時間: 2025-03-18 19:22:38

A. 人工智慧專業主要學什麼 就業方向有哪些

人工智慧技術關繫到人工智慧產品是否可以順利應用到我們的生活場景中。在人工智慧領域,它普遍包含了機器學習、知識圖譜、自然語言處理、人機交互、計算機視覺、生物特徵識別、AR/VR七個關鍵技術。

一、機器學習
機器學習(MachineLearning)是一門涉及統計學、系統辨識、逼近理論、神經網路、優化理論、計算機科學、腦科學等諸多領域的交叉學科,研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的性能,是人工智慧技術的核心。基於數據的機器學習是現代智能技術中的重要方法之一,研究從觀測數據(樣本)出發尋找規律,利用這些規律對未來數據或無法觀測的數據進行預測。根據學習模式、學習方法以及演算法的不同,機器學習存在不同的分類方法。
根據學習模式將機器學習分類為監督學習、無監督學習和強化學習等。
根據學習方法可以將機器學習分為傳統機器學習和深度學習。

二、知識圖譜
知識圖譜本質上是結構化的語義知識庫,是一種由節點和邊組成的圖數據結構,以符號形式描述物理世界中的概念及其相互關系,其基本組成單位是「實體—關系—實體」三元組,以及實體及其相關「屬性—值」對。不同實體之間通過關系相互聯結,構成網狀的知識結構。在知識圖譜中,每個節點表示現實世界的「實體」,每條邊為實體與實體之間的「關系」。通俗地講,知識圖譜就是把所有不同種類的信息連接在一起而得到的一個關系網路,提供了從「關系」的角度去分析問題的能力。
知識圖譜可用於反欺詐、不一致性驗證、組團欺詐等公共安全保障領域,需要用到異常分析、靜態分析、動態分析等數據挖掘方法。特別地,知識圖譜在搜索引擎、可視化展示和精準營銷方面有很大的優勢,已成為業界的熱門工具。但是,知識圖譜的發展還有很大的挑戰,如數據的雜訊問題,即數據本身有錯誤或者數據存在冗餘。隨著知識圖譜應用的不斷深入,還有一系列關鍵技術需要突破。

三、自然語言處理
自然語言處理是計算機科學領域與人工智慧領域中的一個重要方向,研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法,涉及的領域較多,主要包括機器翻譯、機器閱讀理解和問答系統等。
機器翻譯
機器翻譯技術是指利用計算機技術實現從一種自然語言到另外一種自然語言的翻譯過程。基於統計的機器翻譯方法突破了之前基於規則和實例翻譯方法的局限性,翻譯性能取得巨大提升。基於深度神經網路的機器翻譯在日常口語等一些場景的成功應用已經顯現出了巨大的潛力。隨著上下文的語境表徵和知識邏輯推理能力的發展,自然語言知識圖譜不斷擴充,機器翻譯將會在多輪對話翻譯及篇章翻譯等領域取得更大進展。
語義理解
語義理解技術是指利用計算機技術實現對文本篇章的理解,並且回答與篇章相關問題的過程。語義理解更注重於對上下文的理解以及對答案精準程度的把控。隨著MCTest數據集的發布,語義理解受到更多關注,取得了快速發展,相關數據集和對應的神經網路模型層出不窮。語義理解技術將在智能客服、產品自動問答等相關領域發揮重要作用,進一步提高問答與對話系統的精度。
問答系統
問答系統分為開放領域的對話系統和特定領域的問答系統。問答系統技術是指讓計算機像人類一樣用自然語言與人交流的技術。人們可以向問答系統提交用自然語言表達的問題,系統會返回關聯性較高的答案。盡管問答系統目前已經有了不少應用產品出現,但大多是在實際信息服務系統和智能手機助手等領域中的應用,在問答系統魯棒性方面仍然存在著問題和挑戰。
自然語言處理面臨四大挑戰:
一是在詞法、句法、語義、語用和語音等不同層面存在不確定性;
二是新的詞彙、術語、語義和語法導致未知語言現象的不可預測性;
三是數據資源的不充分使其難以覆蓋復雜的語言現象;
四是語義知識的模糊性和錯綜復雜的關聯性難以用簡單的數學模型描述,語義計算需要參數龐大的非線性計算

四、人機交互
人機交互主要研究人和計算機之間的信息交換,主要包括人到計算機和計算機到人的兩部分信息交換,是人工智慧領域的重要的外圍技術。人機交互是與認知心理學、人機工程學、多媒體技術、虛擬現實技術等密切相關的綜合學科。傳統的人與計算機之間的信息交換主要依靠交互設備進行,主要包括鍵盤、滑鼠、操縱桿、數據服裝、眼動跟蹤器、位置跟蹤器、數據手套、壓力筆等輸入設備,以及列印機、繪圖儀、顯示器、頭盔式顯示器、音箱等輸出設備。人機交互技術除了傳統的基本交互和圖形交互外,還包括語音交互、情感交互、體感交互及腦機交互等技術。

五、計算機視覺
計算機視覺是使用計算機模仿人類視覺系統的科學,讓計算機擁有類似人類提取、處理、理解和分析圖像以及圖像序列的能力。自動駕駛、機器人、智能醫療等領域均需要通過計算機視覺技術從視覺信號中提取並處理信息。近來隨著深度學習的發展,預處理、特徵提取與演算法處理漸漸融合,形成端到端的人工智慧演算法技術。根據解決的問題,計算機視覺可分為計算成像學、圖像理解、三維視覺、動態視覺和視頻編解碼五大類。
目前,計算機視覺技術發展迅速,已具備初步的產業規模。未來計算機視覺技術的發展主要面臨以下挑戰:
一是如何在不同的應用領域和其他技術更好的結合,計算機視覺在解決某些問題時可以廣泛利用大數據,已經逐漸成熟並且可以超過人類,而在某些問題上卻無法達到很高的精度;
二是如何降低計算機視覺演算法的開發時間和人力成本,目前計算機視覺演算法需要大量的數據與人工標注,需要較長的研發周期以達到應用領域所要求的精度與耗時;
三是如何加快新型演算法的設計開發,隨著新的成像硬體與人工智慧晶元的出現,針對不同晶元與數據採集設備的計算機視覺演算法的設計與開發也是挑戰之一。

六、生物特徵識別
生物特徵識別技術是指通過個體生理特徵或行為特徵對個體身份進行識別認證的技術。從應用流程看,生物特徵識別通常分為注冊和識別兩個階段。注冊階段通過感測器對人體的生物表徵信息進行採集,如利用圖像感測器對指紋和人臉等光學信息、麥克風對說話聲等聲學信息進行採集,利用數據預處理以及特徵提取技術對採集的數據進行處理,得到相應的特徵進行存儲
識別過程採用與注冊過程一致的信息採集方式對待識別人進行信息採集、數據預處理和特徵提取,然後將提取的特徵與存儲的特徵進行比對分析,完成識別。從應用任務看,生物特徵識別一般分為辨認與確認兩種任務,辨認是指從存儲庫中確定待識別人身份的過程,是一對多的問題;確認是指將待識別人信息與存儲庫中特定單人信息進行比對,確定身份的過程,是一對一的問題。
生物特徵識別技術涉及的內容十分廣泛,包括指紋、掌紋、人臉、虹膜、指靜脈、聲紋、步態等多種生物特徵,其識別過程涉及到圖像處理、計算機視覺、語音識別、機器學習等多項技術。目前生物特徵識別作為重要的智能化身份認證技術,在金融、公共安全、教育、交通等領域得到廣泛的應用。

七、VR/AR
虛擬現實(VR)/增強現實(AR)是以計算機為核心的新型視聽技術。結合相關科學技術,在一定范圍內生成與真實環境在視覺、聽覺、觸感等方面高度近似的數字化環境。用戶藉助必要的裝備與數字化環境中的對象進行交互,相互影響,獲得近似真實環境的感受和體驗,通過顯示設備、跟蹤定位設備、觸力覺交互設備、數據獲取設備、專用晶元等實現。
虛擬現實/增強現實從技術特徵角度,按照不同處理階段,可以分為獲取與建模技術、分析與利用技術、交換與分發技術、展示與交互技術以及技術標准與評價體系五個方面。獲取與建模技術研究如何把物理世界或者人類的創意進行數字化和模型化,難點是三維物理世界的數字化和模型化技術;分析與利用技術重點研究對數字內容進行分析、理解、搜索和知識化方法,其難點是在於內容的語義表示和分析;交換與分發技術主要強調各種網路環境下大規模的數字化內容流通、轉換、集成和面向不同終端用戶的個性化服務等,其核心是開放的內容交換和版權管理技術;展示與交換技術重點研究符合人類習慣數字內容的各種顯示技術及交互方法,以期提高人對復雜信息的認知能力,其難點在於建立自然和諧的人機交互環境;標准與評價體系重點研究虛擬現實/增強現實基礎資源、內容編目、信源編碼等的規范標准以及相應的評估技術。
目前虛擬現實/增強現實面臨的挑戰主要體現在智能獲取、普適設備、自由交互和感知融合四個方面。在硬體平台與裝置、核心晶元與器件、軟體平台與工具、相關標准與規范等方面存在一系列科學技術問題。總體來說虛擬現實/增強現實呈現虛擬現實系統智能化、虛實環境對象無縫融合、自然交互全方位與舒適化的發展趨勢

B. (六) 概率演算法

前面所討論演算法的每一計算步驟都是確定的,而本次所討論的概率演算法允許演算法在執行過程中隨機地選擇下一個計算步驟。在許多情況下,當演算法在執行過程中面臨一個選擇時,隨機性選擇常比最優選擇省時。因此概率演算法可在很大程度上降低演算法的復雜度。

概率演算法的一個基本特徵是對所求解問題的同一實例用同一概率演算法求解兩次可能得到完全不同的效果。這兩次求解所需的時間甚至所得到的結果可能會有相當大的差別。一般情況下, 可將概率演算法大致分為四類:數值概率演算法、蒙特卡羅(MonteCarlo) 演算法、拉斯羨孝陵維加斯(Las Vegas) 演算法和舍伍德(Sherwood) 演算法。

隨機數在隨機化演算法設計中扮演著十分重要的角色。在現實計算機上無法產生真正的隨機數,因此在隨機化演算法中使用的隨機數都是一定程度上隨機的,即偽隨機數。
線性同餘法 是產生偽隨機數的最常用的方法。由線性同餘法產生的隨機序列 滿足

其中 。d稱為該隨機序列的種子。如何選取該方法中的常數b、c和m直接關繫到所產生的隨機序列的隨機性能。這是隨機性理論研究的內容,已超出本書討論的范圍。從直觀上看,m應取得充分大,因此可取m為機器大數,另外應取 ,因此可取b為一素數。

為了在設計概率演算法時便於產生所需的隨機數,建立一個隨機數類RandomNumber:該類包含一個需由用戶初始化的種子randSeed。給定初始種子後,即可產生與之相應的隨機序列。種子randSeed是一個無符號長整型數, 可由用戶選定也可用系統時間自動產生。函數Random的輸入參數 是一個無符號長整型數,它返回 范圍內的一個隨機整數。函數fRandom返回[0,1) 內的一個隨機實數。

數值概率演算法常用於數值問題的求解。這類演算法所得到的往往是近似解。且近似解的精度隨計算時間的增加而不斷提高。在許多情況下,要計算出問題的精確解是不可能的或沒有必要的,因此用數值概率演算法可得到相當滿意的解。

當一個確定性演算法在最壞情況下的計算復雜性與其在平均情況下的計算復雜性有較大差別時

舍伍德演算法就是一種利用隨機演算法改造確定性演算法,消除或減少問題的好壞實例間的這種差別。舍伍德演算法精髓不是避免演算法的最壞情況行為,而是設法消除這種最壞情形行為與特定實例之間的關聯性。

思想:利用隨機演算法改造已有演算法,使得演算法的性能盡量與輸入數據無關,即平滑演算法的性能。它總能求得問兄戚題的一個解,且求得的解總是正確的。

演算法的性能 =平均性能 + 一個很小的隨機值。 舍伍德演算法是為了得到好的平均性能。

一個演算法,對於不同的輸入數據,其演算法的性能是不一樣的。比如快排演算法,每次選擇第一個元素作為基準,慎帶對序列從小到大排序:

拉斯維加斯演算法不會得到不正確的解。一旦用拉斯維加斯演算法找到一個解,這個解就一定是正確解。但有時用拉斯維加斯演算法會找不到解。

與蒙特卡羅演算法類似,拉斯維加斯演算法找到正確解的概率隨著它所用的計算時間的增加而提高。對於所求解問題的任一實例,用同一拉斯維加斯演算法反復對該實例求解足夠多次,可使求解失效的概率任意小。

蒙特卡羅演算法用於求問題的准確解。對於許多問題來說,近似解毫無意義。例如,一個判定問題其解為「是」或「否」,二者必居其一,不存在任何近似解答。又如,我們要求一個整數的因子時所給出的解答必須是准確的,一個整數的近似因子沒有任何意義。

用蒙特卡羅演算法能求得問題的一個解,但這個解未必是正確的。求得正確解的概率依賴於演算法所用的時間。演算法所用的時間越多,得到正確解的概率就越高。蒙特卡羅演算法的主要缺點也在於此。一般情況下,無法有效地判定所得到的解是否肯定正確。

在實際應用中常會遇到一些問題,不論採用確定性演算法或隨機化演算法都無法保證每次都能得到正確的解答。蒙特卡羅演算法則在一般情況下可以保證對問題的所有實例都以高概率給出正確解,但是通常無法判定一個具體解是否正確。

有些蒙特卡羅演算法除了具有描述問題實例的輸入參數外,還具有描述錯誤解可接受概率的參數。這類演算法的計算時間復雜性通常由問題的實例規模以及錯誤解可接受概率的函數來描述。

參考鏈接: http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html

數值概率演算法的應用

舍伍德演算法的應用

拉斯維加斯演算法的應用

蒙特卡羅演算法的應用

C. RSA演算法的C++實現

RSA演算法介紹及java實現,其實java和c++差不多,參考一下吧

<一>基礎

RSA演算法非常簡單,概述如下:
找兩素數p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一個數e,要求滿足e<t並且e與t互素(就是最大公因數為1)
取d*e%t==1

這樣最終得到三個數: n d e

設消息為數M (M <n)
設c=(M**d)%n就得到了加密後的消息c
設m=(c**e)%n則 m == M,從而完成對c的解密。
註:**表示次方,上面兩式中的d和e可以互換。

在對稱加密中:
n d兩個數構成公鑰,可以告訴別人;
n e兩個數構成私鑰,e自己保留,不讓任何人知道。
給別人發送的信息使用e加密,只要別人能用d解開就證明信息是由你發送的,構成了簽名機制。
別人給你發送信息時使用d加密,這樣只有擁有e的你能夠對其解密。

rsa的安全性在於對於一個大數n,沒有有效的方法能夠將其分解
從而在已知n d的情況下無法獲得e;同樣在已知n e的情況下無法
求得d。

<二>實踐

接下來我們來一個實踐,看看實際的操作:
找兩個素數:
p=47
q=59
這樣
n=p*q=2773
t=(p-1)*(q-1)=2668
取e=63,滿足e<t並且e和t互素
用perl簡單窮舉可以獲得滿主 e*d%t ==1的數d:
C:\Temp>perl -e "foreach $i (1..9999){ print($i),last if $i*63%2668==1 }"
847
即d=847

最終我們獲得關鍵的
n=2773
d=847
e=63

取消息M=244我們看看

加密:

c=M**d%n = 244**847%2773
用perl的大數計算來算一下:
C:\Temp>perl -Mbigint -e "print 244**847%2773"
465
即用d對M加密後獲得加密信息c=465

解密:

我們可以用e來對加密後的c進行解密,還原M:
m=c**e%n=465**63%2773 :
C:\Temp>perl -Mbigint -e "print 465**63%2773"
244
即用e對c解密後獲得m=244 , 該值和原始信息M相等。

<三>字元串加密

把上面的過程集成一下我們就能實現一個對字元串加密解密的示例了。
每次取字元串中的一個字元的ascii值作為M進行計算,其輸出為加密後16進制
的數的字元串形式,按3位元組表示,如01F

代碼如下:

#!/usr/bin/perl -w
#RSA 計算過程學習程序編寫的測試程序
#watercloud 2003-8-12
#
use strict;
use Math::BigInt;

my %RSA_CORE = (n=>2773,e=>63,d=>847); #p=47,q=59

my $N=new Math::BigInt($RSA_CORE{n});
my $E=new Math::BigInt($RSA_CORE{e});
my $D=new Math::BigInt($RSA_CORE{d});

print "N=$N D=$D E=$E\n";

sub RSA_ENCRYPT
{
my $r_mess = shift @_;
my ($c,$i,$M,$C,$cmess);

for($i=0;$i < length($$r_mess);$i++)
{
$c=ord(substr($$r_mess,$i,1));
$M=Math::BigInt->new($c);
$C=$M->(); $C->bmodpow($D,$N);
$c=sprintf "%03X",$C;
$cmess.=$c;
}
return \$cmess;
}

sub RSA_DECRYPT
{
my $r_mess = shift @_;
my ($c,$i,$M,$C,$dmess);

for($i=0;$i < length($$r_mess);$i+=3)
{
$c=substr($$r_mess,$i,3);
$c=hex($c);
$M=Math::BigInt->new($c);
$C=$M->(); $C->bmodpow($E,$N);
$c=chr($C);
$dmess.=$c;
}
return \$dmess;
}

my $mess="RSA 娃哈哈哈~~~";
$mess=$ARGV[0] if @ARGV >= 1;
print "原始串:",$mess,"\n";

my $r_cmess = RSA_ENCRYPT(\$mess);
print "加密串:",$$r_cmess,"\n";

my $r_dmess = RSA_DECRYPT($r_cmess);
print "解密串:",$$r_dmess,"\n";

#EOF

測試一下:
C:\Temp>perl rsa-test.pl
N=2773 D=847 E=63
原始串:RSA 娃哈哈哈~~~
加密串:
解密串:RSA 娃哈哈哈~~~

C:\Temp>perl rsa-test.pl 安全焦點(xfocus)
N=2773 D=847 E=63
原始串:安全焦點(xfocus)
加密串:
解密串:安全焦點(xfocus)

<四>提高

前面已經提到,rsa的安全來源於n足夠大,我們測試中使用的n是非常小的,根本不能保障安全性,
我們可以通過RSAKit、RSATool之類的工具獲得足夠大的N 及D E。
通過工具,我們獲得1024位的N及D E來測試一下:

n=EC3A85F5005D
4C2013433B383B
A50E114705D7E2
BC511951

d=0x10001

e=DD28C523C2995
47B77324E66AFF2
789BD782A592D2B
1965

設原始信息
M=

完成這么大數字的計算依賴於大數運算庫,用perl來運算非常簡單:

A) 用d對M進行加密如下:
c=M**d%n :
C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x11111111111122222222222233
333333333, 0x10001,
D55EDBC4F0
6E37108DD6
);print $x->as_hex"
b73d2576bd
47715caa6b
d59ea89b91
f1834580c3f6d90898

即用d對M加密後信息為:
c=b73d2576bd
47715caa6b
d59ea89b91
f1834580c3f6d90898

B) 用e對c進行解密如下:

m=c**e%n :
C:\Temp>perl -Mbigint -e " $x=Math::BigInt->bmodpow(0x17b287be418c69ecd7c39227ab
5aa1d99ef3
0cb4764414
, 0xE760A
3C29954C5D
7324E66AFF
2789BD782A
592D2B1965, CD15F90
4F017F9CCF
DD60438941
);print $x->as_hex"

(我的P4 1.6G的機器上計算了約5秒鍾)

得到用e解密後的m= == M

C) RSA通常的實現
RSA簡潔幽雅,但計算速度比較慢,通常加密中並不是直接使用RSA 來對所有的信息進行加密,
最常見的情況是隨機產生一個對稱加密的密鑰,然後使用對稱加密演算法對信息加密,之後用
RSA對剛才的加密密鑰進行加密。

最後需要說明的是,當前小於1024位的N已經被證明是不安全的
自己使用中不要使用小於1024位的RSA,最好使用2048位的。

----------------------------------------------------------

一個簡單的RSA演算法實現JAVA源代碼:

filename:RSA.java

/*
* Created on Mar 3, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/

import java.math.BigInteger;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.StringTokenizer;

/**
* @author Steve
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class RSA {

/**
* BigInteger.ZERO
*/
private static final BigInteger ZERO = BigInteger.ZERO;

/**
* BigInteger.ONE
*/
private static final BigInteger ONE = BigInteger.ONE;

/**
* Pseudo BigInteger.TWO
*/
private static final BigInteger TWO = new BigInteger("2");

private BigInteger myKey;

private BigInteger myMod;

private int blockSize;

public RSA (BigInteger key, BigInteger n, int b) {
myKey = key;
myMod = n;
blockSize = b;
}

public void encodeFile (String filename) {
byte[] bytes = new byte[blockSize / 8 + 1];
byte[] temp;
int tempLen;
InputStream is = null;
FileWriter writer = null;
try {
is = new FileInputStream(filename);
writer = new FileWriter(filename + ".enc");
}
catch (FileNotFoundException e1){
System.out.println("File not found: " + filename);
}
catch (IOException e1){
System.out.println("File not found: " + filename + ".enc");
}

/**
* Write encoded message to 'filename'.enc
*/
try {
while ((tempLen = is.read(bytes, 1, blockSize / 8)) > 0) {
for (int i = tempLen + 1; i < bytes.length; ++i) {
bytes[i] = 0;
}
writer.write(encodeDecode(new BigInteger(bytes)) + " ");
}
}
catch (IOException e1) {
System.out

熱點內容
光遇國際服安卓和蘋果如何互通 發布:2025-03-19 01:43:03 瀏覽:316
如何加密應用 發布:2025-03-19 01:42:04 瀏覽:617
lol伺服器人數怎麼擠 發布:2025-03-19 01:29:19 瀏覽:838
兄弟連的php 發布:2025-03-19 01:24:25 瀏覽:810
自己做腳本可不可以 發布:2025-03-19 01:20:13 瀏覽:533
33的源碼值 發布:2025-03-19 01:13:25 瀏覽:814
虛榮安卓怎麼充值 發布:2025-03-19 01:12:27 瀏覽:892
如何更改報考密碼 發布:2025-03-19 01:08:12 瀏覽:416
python日期類型 發布:2025-03-19 01:02:28 瀏覽:415
android飛機大戰源碼 發布:2025-03-19 00:56:52 瀏覽:736