第四個知識點 P類複雜問題

第四個知識點 P類複雜問題

原文地址:http://bristolcrypto.blogspot.com/2014/10/52-things-number-4-complexity-class-p.htmlhtml

這個是密碼學52件事第四篇,和理論密碼學的第一篇。在這篇中我被要求定義P類複雜問題。我對計算理論科學知道的很是少當我開始個人PhD,並且我確信不少人和我同樣。所以這篇文章從最簡單的開始,若是你已經會了你能夠跳過前面的部分。首先我會描述複雜性的定義和爲何他很重要,而後咱們定義圖靈機,最後是P類複雜問題,經過一個例子作總結。算法

這篇文章主要的內容就是重寫Introduction to the Theory of Computation by Michael Sipser[1],我以爲他對我真的很重要。函數

Section 1: Complexity and Big O Notation

爲了設計高效的程序,咱們想知道計算機執行給定任務有多難。問題在於,計算機的處理能力因硬件而異(例如,參考上週的52件事)。因此咱們想要一個不依賴與執行任務的機器的具體細節的任務難度的度量。其中一種方法就是限定一個特定型號的計算機執行操做所須要的操做數。這就是所謂的(時間)複雜性理論。測試

不過操做的數量取決於任務的輸入,甚至輸入長度相同操做數都不相同。舉個栗子,假設咱們設計一個程序來判斷你的輸入整數是否是質數。若是咱們輸入256,程序可能判斷的比輸入323更快。儘管它們的長度都是9.由於第一個數字的2就是它的一個因數,第二個有更大的因數。所以咱們一般給出一個最壞時間複雜的分析,當咱們記錄實際的運行長度的時候。所以咱們得到了一個t(n)的表達式。反應了全部輸入的最長運行時間。編碼

並且,當輸入的長度n很是大的時候,咱們可以忽略表達式中除了最大項的項,也能夠忽略任何實例的係數。這被叫作漸進分析。咱們假設n是很是大的,而且詢問當給定最差的n的時候。計算模型須要多少步能完成,而後咱們把答案寫成\(O(t(n))\)。例如,若是咱們發現須要$ 6n^3-n^2+1\(步。咱們寫作\)O(n^3)$,由於全部的項都能被忽略。spa

Section 2:Turing Machines

現在咱們給出這個第一節當中最常常被用的模型。首先,要明白一個字母表是一個非空有窮集。一個字符串是一個從字母表的符號序列。一個語言是字符串集的一部分。設計

圖靈機模型就是真實的計算機。它的內存就是一個有限長度的紙條。任什麼時候候,紙條的每一塊要麼是空的要麼是包含了字符表的中的字符。這個機器有一個讀寫頭可以每次在紙帶上向左向右移動,或者在紙帶上進行讀寫。在機器運行的開始,紙帶最左邊n個都是輸入,剩下的都是空白的。(輸入中沒有空白的,這樣能夠肯定輸入結束的位置)。磁帶頭從最左邊的正方形開始,讀取一個輸入符號,而後根據轉換函數決定下一步要作什麼。轉換函數取決於它當前所讀取的內容,和機器當前的狀態。和返回:code

  • 一個新的狀態
  • 另外一個寫入的符號(可能跟以前的相同)
  • 一個移動的方向(左或者右)

這個機器持續的運行,讀符號,計算轉換函數,寫符號,移動,直到進入接受狀態或者拒絕狀態。htm

若是機器在一個接受狀態結束的話,咱們說它接受了輸入。可是注意:它可能進入一個循環沒有接收也沒有拒絕。例如,它可能從不掛起。若是一個圖靈機接受一些語言的每一個字符串和拒絕其它字符串,咱們就說這個機器斷定了這種語言。咱們把這個過程看做機器測試這個輸入字符串是不是這個語言的一部分。給定一個語言,若是有一個圖靈機能夠斷定它,那麼咱們就說這個語言是可斷定的。blog

這個模型的厲害就是一個圖靈機能作現代計算機全部的事情(被叫作Church-Turing論斷)。咱們定義時間複雜類\(TIME(t(n))\)這樣的一類就是全部的可以被時間複雜度爲\(O(t(n))\)的圖靈所能斷定的,而後咱們就能把計算問題變成一個語言關係問題(輸入字符串是某種語言的成員嗎?這個表示整數的字符串屬於表示素數整數的字符串語言嗎?),同時能夠將計算問題分類變成時間複雜度類。

Section 3: P類複雜問題

最終,咱們終於到達了這個問題!若是\(t(n)=n^k\)對一些\(k>0\),同時\(O(t(n))\)被叫作多項式時間.P類複雜度問題就是那些圖靈機能夠在\(O(t(n))\)時間內可斷定的語言。由於\(k\)可能很是大,圖靈機可能運行的很是慢。可是這個類是給粗略的模型,描述了計算機能夠實現的功能。注意\(t(n)\)好比\(2^n\)這樣時間的語言類與P類是徹底不一樣的,增加速度如此之快,即便你對某些語言有一個決定,你可能會發現宇宙在你輸入以前就結束了!

咱們用一個多項式時間的問題作一個例子。假設你有一個單向圖(一組點和邊,每兩個點之間最多有一條邊,每一個邊有一個箭頭表示方向)。若是咱們編碼這個圖,把兩個節點當作一個單一字符串。咱們能夠造成一種由表示圖形的字符串和兩個節點組成的語言,這樣就能夠沿着第一個節點的邊走,最終到達第二個節點。所以這個語言會有效率的回答是否有一個從節點A到節點B的路徑,這就是路徑問題,經過接受或者拒絕你輸入的圖或者節點。咱們給出這樣的決策器,它可以在多項式時間內斷定這個問題。

  • 首先在A上作一個標記
  • 掃描圖的全部邊。若是你發現一個邊從標記過的節點指向未標記的節點,標記這個未被標記的節點
  • 重複這個過程
  • 若是B被標記了,接受這個語言,不然,拒絕這個語言。

這個過程成功的標記了到A距離爲1的全部節點,距離爲2的全部節點。。。。。所以圖靈機顯然能夠實現上面的過程。如今咱們考慮這個時間複雜度。步驟1和步驟4太容易了。因此咱們集中注意力在步驟2和步驟3,步驟2包括了搜索輸入和在一個位置上放上標記,這個過程明顯是多項式時間內能夠完成的。步驟3重複步驟2的次數很少於節點的數量,節點的數量確定少於輸入的數量,所以這也是線性的。所以整個算法就是線性的。咱們說這個路徑問題就是P類問題。

[1] http://www.amazon.co.uk/Introduction-Theory-Computation-Michael-Sipser/dp/0619217642

[2] http://en.wikipedia.org/wiki/Church%E2%80%93Turing_thesis

相關文章
相關標籤/搜索