NOIP初赛知识点
關于計算機
1.CPU
中央處理器(CPU,Central Processing Unit)是一塊超大規模的集成電路,是一臺計算機的運算核心(Core)和控制核心(Control Unit)。它的功能主要是解釋計算機指令以及處理計算機軟件中的數據。
中央處理器主要包括運算器(算術邏輯運算單元,ALU,Arithmetic Logic Unit)和高速緩沖存儲器(Cache)及實現它們之間聯系的數據(Data)、控制及狀態的總線(Bus)。它與內部存儲器(Memory)和輸入/輸出(I/O)設備合稱為電子計算機三大核心部件。
2.關于文件刪除恢復
計算機是通過覆蓋文件來達到刪除文件的目的。計算機即使回收站清空,文件只是被標記為刪除,在不做任何操作時不會被覆蓋,仍可能通過回復軟件找回。
3.關于復制粘貼
1.剪切板相當于一個中間儲存柜,
2.需復制的內容(文字、圖片、多媒體、文件、文件夾等)在選擇“復制”功能后,數據就暫時保存在這里,
3.在進行下一步“粘貼”操作時,操作系統就將保存在剪切板內的數據進行復制并保存到指定的位置。這就是復制粘貼的原理。
4.在下一次執行“復制”功能后,上一次保存在剪切板內的數據就被新復制的內容所取代,如果沒有執行過“復制”功能,則第一次復制的內容在關機前都一直存在剪切板里,關機后就沒有了,因為剪切板只是臨時性的。
關于計算機語言
1.關于匯編語言:
是一種與具體硬件相關的程序設計語言
在編寫復雜程序時,相對于高級語言而言代碼量較大,且不易調試
可以直接訪問寄存器、內存單元、以及I/O端口
2.C,C++,Pascal語言
C++語言為支持面向對象的高級語言,C語言,Pascal語言是面向結構的高級語言 。
C++不是歷史上第一個支持面向對象的語言。
關于計算機發展史
1.摩爾定律
摩爾定律(Moore’s law)是由英特爾創始人之一戈登?摩爾(Gordon Moor)提出來的。根據摩爾定律,在過去幾十年一級在可預測的未來紀念,單塊集成電驢的集成度大約每18個月翻一番。
補充:
摩爾定律是由英特爾(Intel)創始人之一戈登·摩爾(Gordon Moore)提出來的。其內容為:當價格不變時,集成電路上可容納的元器件的數目,約每隔18-24個月便會增加一倍,性能也將提升一倍。換言之,每一美元所能買到的電腦性能,將每隔18-24個月翻一倍以上。這一定律揭示了信息技術進步的速度。
2.不同種類的計算機
從ENIAC到當前最先進的計算機,馮?諾依曼體系結構始終占有重要地位。馮諾依曼提醒結構的核心內容是采用存儲程序和程序控制原理。
1956年諾貝爾物理學獎手語肖克利、巴丁和布拉頓,以表彰他們對半導體的研究和晶體管效應的發現。
1946年誕生于美國賓夕法尼亞大學的ENIAC屬于電子管計算機。
關于操作系統:
Photoshop不屬于操作系統.
關于互聯網
1.OSI模型
第7層 應用層
提供為應用軟件而設的界面,以設置與另一應用軟件之間的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。
第6層 表示層
把數據轉換為能與接收者的系統格式兼容并適合傳輸的格式。
第5層 會話層
負責在數據傳輸中設置和維護電腦網絡中兩臺電腦之間的通信連接。
第4層 傳輸層
把傳輸表頭(TH)加至數據以形成數據包。傳輸表頭包含了所使用的協議等發送信息。例如:傳輸控制協議義(TCP) 等。
第3層 網絡層
決定數據的路徑選擇和轉寄,將網絡表頭(NH)加至數據包,以形成分組。網絡表頭包含了網絡數據。例如:互聯網協議(IP) 等。
第2層 數據鏈路層
負責網絡尋址、錯誤偵測和改錯。當表頭和表尾被加至數據包時,會形成了幀。數據鏈表頭(DLH)是包含了物理地址和錯誤偵測及改錯的方法。數據鏈表尾(DLT)是一串指示數據包末端的字符串。例如以太網、無線局域網(Wi-Fi)和通用分組無線服務(GPRS)等。
第1層 物理層
在局部局域網上傳送幀,它負責管理電腦通信設備和網絡媒體之間的互通。包括了針腳、電壓、線纜規范、集線器、中繼器、網卡、主機適配器等
2.幾個網絡協議
HTTP(HyperText Transfer Protocol超文本傳輸協議是互聯網上應用最為廣泛的一種網絡協議)
HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer以安全為目標的HTTP通道,簡單講是HTTP的安全版)
FTP(File Transfer Protocol文件傳輸協議)
TELNET(Telnet協議是TCP/IP協議族中的一員,是Internet遠程登陸服務的標準協議和主要方式)
SSH(Secure Shell安全外殼協議)
SMTP(Simple Mail Transfer Protocol簡單郵件傳輸協議)
POP3(Post Office Protocol - Version 3郵局協議版本3)
3.網站域名&&IP地址
IP地址
IP地址是指互聯網協議地址。
IP地址通常用“點分十進制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進制整數。
域名
介紹
域名是由一串用“點”分隔的字符組成的Internet上某一臺計算機或計算機組的名稱,用于在數據傳輸時標識計算機的電子方位(有時也指地理位置,地理上的域名,指代有行政自主權的一個地方區域)。域名是一個IP地址上有“面具” 。域名的目的是便于記憶和溝通的一組服務器的地址(網站,電子郵件,FTP等)。域名作為力所能及難忘的互聯網參與者的名稱。域名按域名系統(DNS)的規則流程組成。在DNS中注冊的任何名稱都是域名。域名用于各種網絡環境和應用程序特定的命名和尋址目的。通常,域名表示互聯網協議(IP)資源,例如用于訪問因特網的個人計算機,托管網站的服務器計算機,或網站本身或通過因特網傳送的任何其他服務。世界上第一個注冊的域名是在1985年1月注冊的。
域名結構
.TOP–適用于所有企業和個人,英文單詞,簡單易記,含義“高端、頂級”,提升品牌價值,是企業建站、互聯網應用首選域名。
.COM–用于商業機構。它是最常見的頂級域名。任何人都可以注冊.COM 形式的域名。
.XYZ–作為字母表最后三個字母,組合含義靈活,沒有限制,任何企業和個人都可以注冊.XYZ結尾的域名。
.NET–最初是用于網絡組織,例如因特網服務商和維修商。任何人都可以注冊以.NET結尾的域名。
.ORG–是為各種組織包括非盈利組織而定的,任何人都可以注冊以.ORG 結尾的域名。
我國頂級域名為.cn
關于樹的遍歷
樹的遍歷順序大體分為三種:前序遍歷(先根遍歷、先序遍歷),中序遍歷(中根遍歷),后序遍歷(后根遍歷)。
?
如圖所示二叉樹:
?
?
前序遍歷:前序遍歷可以記為根左右,若二叉樹為空,則結束返回。
?
前序遍歷的規則:
(1)訪問根節點
(2)前序遍歷左子樹
(3)前序遍歷右子樹
?
這里需要注意:在完成第2,3步的時候,也是要按照前序遍歷二叉樹的規則完成。
前序遍歷的輸出結果:ABDECF
?
中序遍歷:中序遍歷可以記為左根右,也就是說在二叉樹的遍歷過程中,首先要遍歷二叉樹的左子樹,接著遍歷根節點,最后遍歷右子樹。
同樣,在二叉樹為空的時候,結束返回。
?
中序遍歷的規則:
(1)中序遍歷左子樹
(2)訪問根節點
(3)中序遍歷右子樹
?
注意:在完成第1,3步的時候,要按照中序遍歷的規則來完成。
中序遍歷的輸出結果:DBEAFC
?
后序遍歷:后序遍歷可以記為左右根,也就是說在二叉樹的遍歷過程中,首先按照后序遍歷的規則遍歷左子樹,接著按照后序遍歷的規則遍歷右子樹,最后訪問根節點。
在二叉樹為空的時候,結束返回。
后序遍歷二叉樹的規則:
(1)后序遍歷左子樹
(2)后序遍歷右子樹
(3)訪問根節點
注意:在完成1,2步的時候,依然要按照后序遍歷的規則來完成。
后序遍歷的輸出順序:DEBFCA
?
關于原碼,反碼,補碼
?
數值在計算機中是以補碼的方式存儲的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。
對于一個數, 計算機要使用一定的編碼方式進行存儲。 原碼, 反碼, 補碼是計算機存儲一個具體數字的編碼方式。
一個數在計算機中的二進制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。比如,十進制中的數 +2 ,計算機字長為8位,轉換成二進制就是[00000010]。如果是 -2 ,就是 [10000010] 。因為第一位是符號位,所以機器數的形式值就不等于真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進制等于130)。所以將帶符號位的機器數對應的真正數值稱為機器數的真值。
- 原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值。
- 反碼的表示方法是:正數的反碼是其本身;負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反。
- 補碼的表示方法是:正數的補碼就是其本身;負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1。 (即在反碼的基礎上+1)
舉例:
| 85 | 0101 0101 | 0101 0101 | 0101 0101 |
| -85 | 1101 0101 | 1010 1010 | 1010 1011 |
| 9 | 0000 1001 | 0000 1001 | 0000 1001 |
| -9 | 1000 1001 | 1111 0110 | 1111 0111 |
那么計算機為什么要使用補碼呢?
首先,根據運算法則減去一個正數等于加上一個負數, 即: 1-1 = 1+(-1), 所以計算機被設計成只有加法而沒有減法, 而讓計算機辨別”符號位”會讓計算機的基礎電路設計變得十分復雜,于是就讓符號位也參與運算,從而產生了反碼。
用反碼計算, 出現了”0”這個特殊的數值, 0帶符號是沒有任何意義的。 而且會有[0000 0000]和[1000 0000]兩個編碼表示0。于是設計了補碼, 負數的補碼就是反碼+1,正數的補碼就是正數本身,從而解決了0的符號以及兩個編碼的問題: 用[0000 0000]表示0,用[1000 0000]表示-128。
注意-128實際上是使用以前的-0的補碼來表示的, 所以-128并沒有原碼和反碼。使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數。 這就是為什么8位二進制, 使用補碼表示的范圍為[-128, 127]。
?
關于進制轉換
?
進制轉換是個老問題了,今天恰巧看見。我詳細的去分析下它。留一筆吧
二進制的范圍是(0-1), 不包含2
八進制的范圍是(0-7) ,不包含8
十六進制的范圍是(0-15) ,不包含16
先講十進制---->二進制的轉換,舉例子說明的十進制數字12
?
這里我把十進制的12轉換成二進制,該為多少?
十進制轉換二進制方法:十進制通通除以2
拿12來開刀
?
我們每次都除以2直到商為0停止,最后的二進制結果取每次得到的余數
? ? ? ? ? ? ? ?最后得到結果是1100
?
?
十進制轉換二進制很簡單,下面逆向分析,二進制如何轉換十進制
隨機一個二進制0100,我開始嘗試把0100轉換成十進制
也很簡單
先看一張圖
搞清楚上面那張圖,下面運算就很簡單了
?
十進制轉換成二進制和二進制轉成十進制的算法都講完了。這只是開胃菜。我們繼續:
下面是十進制轉換成八進制的演示:
學到這里相信大家都已經知道十進制轉換成二進制是:十進制數字每次都除以2
那么十進制轉換成八進制是否有這種類似的規律可言呢?
猜的沒錯,的確如此。十進制轉換成八進制就是:十進制數字每次都除以8
我們獎十進制54轉換成八進制
?
這里我算出來是66
驗證下答案:
?
結果就是余數從下往上數,這個我在前面就講過。
現在開始演示八進制轉換成十進制
在上面的知識學習中我們發現二進制轉換成十進制是:二進制數字*2^n次方(n隨位置的變化而變化)
?那么八進制轉換成十進制是否也存在這種規律呢?
答案是必然的
? ? ? 舉例子說明的八進制數字是64,把64轉換成十進制是多少呢?
?
? ?這里我算出來是52
? ?驗證下結果:
?
?沒問題
剛剛我講解了十進制轉換成八進制,同時也講解了八進制轉換十進制的方法
現在我們需要加大難度,我們嘗試將二進制轉換成八進制
該怎么做?這里存在一個算法公式:二進制每三個位置等于一個八進制數
? ???理解這個公式就很輕松的做這種轉換
? ? ?我們隨機輸入二進制數字進行測試:0100101010101
就選擇我紅色標記的二進制數,將它轉換成八進制
?
?
所以二進制0100101010101的八進制數是4525
演示完二進制轉換成八進制,那么八進制轉換成二進制呢?
一個道理,只要記住:每三個二進制=一個八進制數
假設八進制數字是15,把15轉換成二進制,我來演示下:
?
?
驗證結果:
? ? ?
#八進制轉換成二進制還可以這樣:先八進制轉換成十進制然后在十進制轉換成二進制,但是那樣太麻煩,這樣一次性算好比較好。
?
? 假如你能從最前面看到這里,那我表示佩服。哈哈?
? 回顧上面講的,我們已經講完了:十進制和二進制之間的轉換和十進制,八進制,二進制之間的轉換
? 寫到這里,筆者自己也有點亂了,不要說了,一鼓作氣!下面要介紹是十六進制!
首先講解十進制轉換成十六進制
? ?在進行轉換之前學了解一個十六進制的基礎知識:
?
? 從16進制開始,不是簡單的都是數字了開始多了字母!
? ?好了咱們繼續,這里我選取的十進制數字是:15
???我開始將十進制15轉換成十六進制,會是多少呢?
??
?
?
?現在我們嘗試把十六進制轉換成十進制該怎么轉換?
和之前二進制轉換十進制和八進制轉換成十進制一個道理,這里是:十六進制數字*16^n次方(n隨位置的變化而變化)
? ? ? 這里演示的十六進制數字是:23
? ? ?這里我將十六進制的23轉換成十進制:
?
?
?演示完了十進制和十六進制之間的轉換,現在開始演示十六進制轉換成八進制
選取16進制23
??轉換思路有點多。。。我隨機選取一種吧,將23先轉換成十進制,上面我已經做過了是35
將十進制35轉換成八進制就是:
?
這個其實不難,就是兩次轉換而已
? ?現在演示最關鍵的就是二進制和十六進制之間的轉換
在講解之前先講解一個很重要的公式:每四個二進制=一個八進制數 (正所謂2^4=16)
? ? 那么隨機選擇一個二進制數字:0100100011
?
?
? ? ? 二進制轉換成十六進制講完,下面是十六進制轉換成二進制
? ? ? 隨機選取十六進制:15
? ??
?
?
關于P問題、NP問題和NPC問題
????這或許是眾多OIer最大的誤區之一。
????你會經常看到網上出現“這怎么做,這不是NP問題嗎”、“這個只有搜了,這已經被證明是NP問題了”之類的話。你要知道,大多數人此時所說的NP問題其實都是指的NPC問題。他們沒有搞清楚NP問題和NPC問題的概念。NP問題并不是那種“只有搜才行”的問題,NPC問題才是。好,行了,基本上這個誤解已經被澄清了。下面的內容都是在講什么是P問題,什么是NP問題,什么是NPC問題,你如果不是很感興趣就可以不看了。接下來你可以看到,把NP問題當成是 NPC問題是一個多大的錯誤。
?
????還是先用幾句話簡單說明一下時間復雜度。時間復雜度并不是表示一個程序解決問題需要花多少時間,而是當問題規模擴大后,程序需要的時間長度增長得有多快。也就是說,對于高速處理數據的計算機來說,處理某一個特定數據的效率不能衡量一個程序的好壞,而應該看當這個數據的規模變大到數百倍后,程序運行時間是否還是一樣,或者也跟著慢了數百倍,或者變慢了數萬倍。不管數據有多大,程序處理花的時間始終是那么多的,我們就說這個程序很好,具有O(1)的時間復雜度,也稱常數級復雜度;數據規模變得有多大,花的時間也跟著變得有多長,這個程序的時間復雜度就是O(n),比如找n個數中的最大值;而像冒泡排序、插入排序等,數據擴大2倍,時間變慢4倍的,屬于O(n^2)的復雜度。還有一些窮舉類的算法,所需時間長度成幾何階數上漲,這就是O(a^n)的指數級復雜度,甚至O(n!)的階乘級復雜度。不會存在O(2*n^2)的復雜度,因為前面的那個“2”是系數,根本不會影響到整個程序的時間增長。同樣地,O (n^3+n^2)的復雜度也就是O(n^3)的復雜度。因此,我們會說,一個O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,盡管在n很小的時候,前者優于后者,但后者時間隨數據規模增長得慢,最終O(n^3)的復雜度將遠遠超過O(n^2)。我們也說,O(n^100)的復雜度小于O(1.01^n)的復雜度。
????容易看出,前面的幾類復雜度被分為兩種級別,其中后者的復雜度無論如何都遠遠大于前者:一種是O(1),O(log(n)),O(n^a)等,我們把它叫做多項式級的復雜度,因為它的規模n出現在底數的位置;另一種是O(a^n)和O(n!)型復雜度,它是非多項式級的,其復雜度計算機往往不能承受。當我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的復雜度,非多項式級的復雜度需要的時間太多,往往會超時,除非是數據規模非常小。
?
????自然地,人們會想到一個問題:會不會所有的問題都可以找到復雜度為多項式級的算法呢?很遺憾,答案是否定的。有些問題甚至根本不可能找到一個正確的算法來,這稱之為“不可解問題”(Undecidable Decision Problem)。The Halting Problem就是一個著名的不可解問題,在我的Blog上有過專門的介紹和證明。再比如,輸出從1到n這n個數的全排列。不管你用什么方法,你的復雜度都是階乘級,因為你總得用階乘級的時間打印出結果來。有人說,這樣的“問題”不是一個“正規”的問題,正規的問題是讓程序解決一個問題,輸出一個“YES”或“NO”(這被稱為判定性問題),或者一個什么什么的最優值(這被稱為最優化問題)。那么,根據這個定義,我也能舉出一個不大可能會有多項式級算法的問題來:Hamilton回路。問題是這樣的:給你一個圖,問你能否找到一條經過每個頂點一次且恰好一次(不遺漏也不重復)最后又走回來的路(滿足這個條件的路徑叫做Hamilton回路)。這個問題現在還沒有找到多項式級的算法。事實上,這個問題就是我們后面要說的NPC問題。
?
????下面引入P類問題的概念:如果一個問題可以找到一個能在多項式的時間里解決它的算法,那么這個問題就屬于P問題。P是英文單詞多項式的第一個字母。哪些問題是P類問題呢?通常NOI和NOIP不會出不屬于P類問題的題目。我們常見到的一些信息奧賽的題目都是P問題。道理很簡單,一個用窮舉換來的非多項式級時間的超時程序不會涵蓋任何有價值的算法。
????接下來引入NP問題的概念。這個就有點難理解了,或者說容易理解錯誤。在這里強調(回到我竭力想澄清的誤區上),NP問題不是非P類問題。NP問題是指可以在多項式的時間里驗證一個解的問題。NP問題的另一個定義是,可以在多項式的時間里猜出一個解的問題。比方說,我RP很好,在程序中需要枚舉時,我可以一猜一個準。現在某人拿到了一個求最短路徑的問題,問從起點到終點是否有一條小于100個單位長度的路線。它根據數據畫好了圖,但怎么也算不出來,于是來問我:你看怎么選條路走得最少?我說,我RP很好,肯定能隨便給你指條很短的路出來。然后我就胡亂畫了幾條線,說就這條吧。那人按我指的這條把權值加起來一看,嘿,神了,路徑長度98,比100小。于是答案出來了,存在比100小的路徑。別人會問他這題怎么做出來的,他就可以說,因為我找到了一個比100 小的解。在這個題中,找一個解很困難,但驗證一個解很容易。驗證一個解只需要O(n)的時間復雜度,也就是說我可以花O(n)的時間把我猜的路徑的長度加出來。那么,只要我RP好,猜得準,我一定能在多項式的時間里解決這個問題。我猜到的方案總是最優的,不滿足題意的方案也不會來騙我去選它。這就是NP問題。當然有不是NP問題的問題,即你猜到了解但是沒用,因為你不能在多項式的時間里去驗證它。下面我要舉的例子是一個經典的例子,它指出了一個目前還沒有辦法在多項式的時間里驗證一個解的問題。很顯然,前面所說的Hamilton回路是NP問題,因為驗證一條路是否恰好經過了每一個頂點非常容易。但我要把問題換成這樣:試問一個圖中是否不存在Hamilton回路。這樣問題就沒法在多項式的時間里進行驗證了,因為除非你試過所有的路,否則你不敢斷定它“沒有Hamilton回路”。
????之所以要定義NP問題,是因為通常只有NP問題才可能找到多項式的算法。我們不會指望一個連多項式地驗證一個解都不行的問題存在一個解決它的多項式級的算法。相信讀者很快明白,信息學中的號稱最困難的問題——“NP問題”,實際上是在探討NP問題與P類問題的關系。
????很顯然,所有的P類問題都是NP問題。也就是說,能多項式地解決一個問題,必然能多項式地驗證一個問題的解——既然正解都出來了,驗證任意給定的解也只需要比較一下就可以了。關鍵是,人們想知道,是否所有的NP問題都是P類問題。我們可以再用集合的觀點來說明。如果把所有P類問題歸為一個集合P中,把所有 NP問題劃進另一個集合NP中,那么,顯然有P屬于NP。現在,所有對NP問題的研究都集中在一個問題上,即究竟是否有P=NP?通常所謂的“NP問題”,其實就一句話:證明或推翻P=NP。
????NP問題一直都是信息學的巔峰。巔峰,意即很引人注目但難以解決。在信息學研究中,這是一個耗費了很多時間和精力也沒有解決的終極問
題,好比物理學中的大統一和數學中的歌德巴赫猜想等。
????目前為止這個問題還“啃不動”。但是,一個總的趨勢、一個大方向是有的。人們普遍認為,P=NP不成立,也就是說,多數人相信,存在至少一個不可能有多項式級復雜度的算法的NP問題。人們如此堅信P≠NP是有原因的,就是在研究NP問題的過程中找出了一類非常特殊的NP問題叫做NP-完全問題,也即所謂的 NPC問題。C是英文單詞“完全”的第一個字母。正是NPC問題的存在,使人們相信P≠NP。下文將花大量篇幅介紹NPC問題,你從中可以體會到NPC問題使P=NP變得多么不可思議。
????為了說明NPC問題,我們先引入一個概念——約化(Reducibility,有的資料上叫“歸約”)。
????簡單地說,一個問題A可以約化為問題B的含義即是,可以用問題B的解法解決問題A,或者說,問題A可以“變成”問題B。《算法導論》上舉了這么一個例子。比如說,現在有兩個問題:求解一個一元一次方程和求解一個一元二次方程。那么我們說,前者可以約化為后者,意即知道如何解一個一元二次方程那么一定能解出一元一次方程。我們可以寫出兩個程序分別對應兩個問題,那么我們能找到一個“規則”,按照這個規則把解一元一次方程程序的輸入數據變一下,用在解一元二次方程的程序上,兩個程序總能得到一樣的結果。這個規則即是:兩個方程的對應項系數不變,一元二次方程的二次項系數為0。按照這個規則把前一個問題轉換成后一個問題,兩個問題就等價了。同樣地,我們可以說,Hamilton回路可以約化為TSP問題(Travelling Salesman Problem,旅行商問題):在Hamilton回路問題中,兩點相連即這兩點距離為0,兩點不直接相連則令其距離為1,于是問題轉化為在TSP問題中,是否存在一條長為0的路徑。Hamilton回路存在當且僅當TSP問題中存在長為0的回路。
????“問題A可約化為問題B”有一個重要的直觀意義:B的時間復雜度高于或者等于A的時間復雜度。也就是說,問題A不比問題B難。這很容易理解。既然問題A能用問題B來解決,倘若B的時間復雜度比A的時間復雜度還低了,那A的算法就可以改進為B的算法,兩者的時間復雜度還是相同。正如解一元二次方程比解一元一次方程難,因為解決前者的方法可以用來解決后者。
????很顯然,約化具有一項重要的性質:約化具有傳遞性。如果問題A可約化為問題B,問題B可約化為問題C,則問題A一定可約化為問題C。這個道理非常簡單,就不必闡述了。
????現在再來說一下約化的標準概念就不難理解了:如果能找到這樣一個變化法則,對任意一個程序A的輸入,都能按這個法則變換成程序B的輸入,使兩程序的輸出相同,那么我們說,問題A可約化為問題B。
????當然,我們所說的“可約化”是指的可“多項式地”約化(Polynomial-time Reducible),即變換輸入的方法是能在多項式的時間里完成的。約化的過程只有用多項式的時間完成才有意義。
?
????好了,從約化的定義中我們看到,一個問題約化為另一個問題,時間復雜度增加了,問題的應用范圍也增大了。通過對某些問題的不斷約化,我們能夠不斷尋找復雜度更高,但應用范圍更廣的算法來代替復雜度雖然低,但只能用于很小的一類問題的算法。再回想前面講的P和NP問題,聯想起約化的傳遞性,自然地,我們會想問,如果不斷地約化上去,不斷找到能“通吃”若干小NP問題的一個稍復雜的大NP問題,那么最后是否有可能找到一個時間復雜度最高,并且能“通吃”所有的 NP問題的這樣一個超級NP問題?答案居然是肯定的。也就是說,存在這樣一個NP問題,所有的NP問題都可以約化成它。換句話說,只要解決了這個問題,那么所有的NP問題都解決了。這種問題的存在難以置信,并且更加不可思議的是,這種問題不只一個,它有很多個,它是一類問題。這一類問題就是傳說中的NPC 問題,也就是NP-完全問題。NPC問題的出現使整個NP問題的研究得到了飛躍式的發展。我們有理由相信,NPC問題是最復雜的問題。再次回到全文開頭,我們可以看到,人們想表達一個問題不存在多項式的高效算法時應該說它“屬于NPC問題”。此時,我的目的終于達到了,我已經把NP問題和NPC問題區別開了。到此為止,本文已經寫了近5000字了,我佩服你還能看到這里來,同時也佩服一下自己能寫到這里來。
?
????NPC問題的定義非常簡單。同時滿足下面兩個條件的問題就是NPC問題。首先,它得是一個NP問題;然后,所有的NP問題都可以約化到它。證明一個問題是 NPC問題也很簡單。先證明它至少是一個NP問題,再證明其中一個已知的NPC問題能約化到它(由約化的傳遞性,則NPC問題定義的第二條也得以滿足;至于第一個NPC問題是怎么來的,下文將介紹),這樣就可以說它是NPC問題了。
????既然所有的NP問題都能約化成NPC問題,那么只要任意一個NPC問題找到了一個多項式的算法,那么所有的NP問題都能用這個算法解決了,NP也就等于P 了。因此,給NPC找一個多項式算法太不可思議了。因此,前文才說,“正是NPC問題的存在,使人們相信P≠NP”。我們可以就此直觀地理解,NPC問題目前沒有多項式的有效算法,只能用指數級甚至階乘級復雜度的搜索。
?
????順便講一下NP-Hard問題。NP-Hard問題是這樣一種問題,它滿足NPC問題定義的第二條但不一定要滿足第一條(就是說,NP-Hard問題要比 NPC問題的范圍廣)。NP-Hard問題同樣難以找到多項式的算法,但它不列入我們的研究范圍,因為它不一定是NP問題。即使NPC問題發現了多項式級的算法,NP-Hard問題有可能仍然無法得到多項式級的算法。事實上,由于NP-Hard放寬了限定條件,它將有可能比所有的NPC問題的時間復雜度更高從而更難以解決。
?
????不要以為NPC問題是一紙空談。NPC問題是存在的。確實有這么一個非常具體的問題屬于NPC問題。下文即將介紹它。
????下文即將介紹邏輯電路問題。這是第一個NPC問題。其它的NPC問題都是由這個問題約化而來的。因此,邏輯電路問題是NPC類問題的“鼻祖”。
????邏輯電路問題是指的這樣一個問題:給定一個邏輯電路,問是否存在一種輸入使輸出為True。
????什么叫做邏輯電路呢?一個邏輯電路由若干個輸入,一個輸出,若干“邏輯門”和密密麻麻的線組成。看下面一例,不需要解釋你馬上就明白了。
??┌───┐
??│ 輸入1├─→┐????┌──┐
??└───┘????└─→┤????│
??????????????????????│ or ├→─┐
??┌───┐????┌─→┤????│????│????┌──┐
??│ 輸入2├─→┤????└──┘????└─→┤????│
?&
nbsp;└───┘????│????????????????┌─→┤AND ├──→輸出
????????????????└────────┘┌→┤????│
??┌───┐????┌──┐????????????│??└──┘
??│ 輸入3├─→┤ NOT├─→────┘
??└───┘????└──┘
????這是個較簡單的邏輯電路,當輸入1、輸入2、輸入3分別為True、True、False或False、True、False時,輸出為True。
????有輸出無論如何都不可能為True的邏輯電路嗎?有。下面就是一個簡單的例子。
??┌───┐
??│輸入1 ├→─┐????┌──┐
??└───┘????└─→┤????│
??????????????????????│AND ├─→┐
????????????????┌─→┤????│????│
????????????????│????└──┘????│??┌──┐
????????????????│????????????????└→┤????│
??┌───┐????│????????????????????│AND ├─→輸出
??│輸入2 ├→─┤??┌──┐??????┌→┤????│
??└───┘????└→┤NOT ├→──┘??└──┘
????????????????????└──┘
????上面這個邏輯電路中,無論輸入是什么,輸出都是False。我們就說,這個邏輯電路不存在使輸出為True的一組輸入。
????回到上文,給定一個邏輯電路,問是否存在一種輸入使輸出為True,這即邏輯電路問題。
????邏輯電路問題屬于NPC問題。這是有嚴格證明的。它顯然屬于NP問題,并且可以直接證明所有的NP問題都可以約化到它(不要以為NP問題有無窮多個將給證明造成不可逾越的困難)。證明過程相當復雜,其大概意思是說任意一個NP問題的輸入和輸出都可以轉換成邏輯電路的輸入和輸出(想想計算機內部也不過是一些 0和1的運算),因此對于一個NP問題來說,問題轉化為了求出滿足結果為True的一個輸入(即一個可行解)。
?
????有了第一個NPC問題后,一大堆NPC問題就出現了,因為再證明一個新的NPC問題只需要將一個已知的NPC問題約化到它就行了。后來,Hamilton 回路成了NPC問題,TSP問題也成了NPC問題。現在被證明是NPC問題的有很多,任何一個找到了多項式算法的話所有的NP問題都可以完美解決了。因此說,正是因為NPC問題的存在,P=NP變得難以置信。P=NP問題還有許多有趣的東西,有待大家自己進一步的挖掘。攀登這個信息學的巔峰是我們這一代的終極目標。現在我們需要做的,至少是不要把概念弄混淆了。
?
整合自http://www.matrix67.com/blog/archives/105,https://blog.csdn.net/qq_34940287/article/details/78191782等dalao博客。
轉載于:https://www.cnblogs.com/mxrmxr/p/9767067.html
總結
- 上一篇: 基于DS18B20数字温度传感器的温度计
- 下一篇: Arduino驱动DS18B20数字温度