筆試歸來,感慨一下

2021-04-20 08:27:32 字數 3742 閱讀 2813

今天去筆試了網易,感覺題型跟以往有很大的差別,去掉了人文類的和邏輯思維(智力)類的題型,全部都是技術類的試題,感覺起來面很廣,比如說問到了np問題並舉例、說說c++ traits等等,但總體來說還都符合我們大多數人的習慣吧, 我們或許可以欣慰一番,呵呵...

下面把答得不好的或者完全沒答的總結一下

np問題:

什麼叫做np問題,什麼叫做npc問題?

首先說明一下問題的複雜性和演算法的複雜性的區別,下面只考慮時間複雜性。演算法的複雜性是指解決問題的乙個具體的演算法的執行時間,這是演算法的性質;問題的複雜性是指這個問題本身的複雜程度,是問題的性質。比如對於排序問題,如果我們只能通過元素間的相互比較來確定元素間的相互位置,而沒有其他的附加可用資訊,則排序問題的複雜性是o(nlgn),但是排序演算法有很多,冒泡法是o(n^2),快速排序平均情況下是o(nlgn)等等,排序問題的複雜性是指在所有的解決該問題的演算法中最好演算法的複雜性。問題的複雜性不可能通過列舉各種可能演算法來得到,一般都是預先估計乙個值,然後從理論上證明。

為了研究問題的複雜性,我們必須將問題抽象,為了簡化問題,我們只考慮一類簡單的問題,判定性問題,即提出乙個問題,只需要回答yes或者no的問題。任何一般的最優化問題都可以轉化為一系列判定性問題,比如求圖中從a到b的最短路徑,可以轉化成:從a到b是否有長度為1的路徑?從a到b是否有長度為2的路徑?。。。從a到b是否有長度為k的路徑?如果問到了k的時候回答了yes,則停止發問,我們可以說從a到b的最短路徑就是k。如果乙個判定性問題的複雜度是該問題的乙個例項的規模n的多項式函式,則我們說這種可以在多項式時間內解決的判定性問題屬於p類問題。p類問題就是所有複雜度為多項式時間的問題的集合。然而有些問題很難找到多項式時間的演算法(或許根本不存在),比如找出無向圖中的哈公尺爾頓迴路問題,但是我們發現如果給了我們該問題的乙個答案,我們可以在多項式時間內判斷這個答案是否正確。比如說對於哈公尺爾頓迴路問題,給乙個任意的迴路,我們很容易判斷他是否是哈公尺爾頓迴路(只要看是不是所有的頂點都在迴路中就可以了)。這種可以在多項式時間內驗證乙個解是否正確的問題稱為np問題。顯然,所有的p類問題都是屬於np問題的,但是現在的問題是,p是否等於np?這個問題至今還未解決。注意,np問題不一定都是難解的問題,比如簡單的陣列排序問題是p類問題,但是p屬於np,所以也是np問題,你能說他很難解麼?剛才說了,現在還不知道是否有p=np或者p<>np,但是後來人們發現還有一系列的特殊np問題,這類問題的特殊性質使得很多人相信p<>np,只不過現在還無法證明。這類特殊的np問題就是np完全問題(npc問題,c代表complete)。npc問題存在著乙個令人驚訝的性質,即如果乙個npc問題存在多項式時間的演算法,則所有的np問題都可以在多項式時間內求解,即p=np成立!!這是因為,每乙個npc問題可以在多項式時間內轉化成任何乙個np問題。比如前面說的哈公尺爾頓迴路問題就是乙個npc問題。npc問題的歷史並不久,cook在2023年找到了第乙個npc問題,此後人們又陸續發現很多npc問題,現在可能已經有3000多個了。所以,我們一般認為npc問題是難解的問題,因為他不太可能存在乙個多項式時間的演算法(如果存在則所有的np問題都存在多項式時間演算法,這太不可思議了,但是也不是不可能)。類似哈公尺爾頓迴路/路徑問題,貨郎擔問題,集團問題,最小邊覆蓋問題(注意和路徑覆蓋的區別),等等很多問題都是npc問題,所以都是難解的問題。

(哈密頓路徑問題: 天文學家哈密頓(william rowan hamilton) 提出,在圖中找出一條包含所有結點的閉路,並且,出來起點和終點重合外,這條閉路所含結點是互不相同的,可以在多項式時間類判斷乙個迴路是否是哈密頓迴路,但目前沒有演算法直接解出哈密頓迴路。)

np完全問題

np完全問題是不確定性圖靈機在p時間內能解決的問題,是世界七大數學難題之一。

np完全問題排在百萬美元大獎的首位,足見他的顯赫地位和無窮魅力。

數學上著名的np問題,完整的叫法是np完全問題,也即「np complete」問題,簡單的寫法,是 np=p?的問題。問題就在這個問號上,到底是np等於p,還是np不等於p。證明其中之一,便可以拿百萬美元大獎。

這個獎還沒有人拿到,也就是說,np問題到底是polynomial(意思是多項式的),還是non-polynomial,尚無定論。

np裡面的n,不是non-polynomial的n,是non-deterministic(意思是非確定性的),p代表polynomial倒是對的。np就是non-deterministic polynomial的問題,也即是多項式複雜程度的非確定性問題。

什麼是非確定性問題呢?有些計算問題是確定性的,比如加減乘除之類,你只要按照公式推導,按部就班一步步來,就可以得到結果。但是,有些問題是無法按部就班直接地計算出來。比如,找大質數的問題。有沒有乙個公式,你一套公式,就可以一步步推算出來,下乙個質數應該是多少呢?這樣的公式是沒有的。再比如,大的合數分解質因數的問題,有沒有乙個公式,把合數代進去,就直接可以算出,它的因子各自是多少?也沒有這樣的公式。

這種問題的答案,是無法直接計算得到的,只能通過間接的「猜算」來得到結果。這也就是非確定性問題。而這些問題的通常有個演算法,它不能直接告訴你答案是什麼,但可以告訴你,某個可能的結果是正確的答案還是錯誤的。這個可以告訴你「猜算」的答案正確與否的演算法,假如可以在多項式時間內算出來,就叫做多項式非確定性問題。而如果這個問題的所有可能答案,都是可以在多項式時間內進行正確與否的驗算的話,就叫完全多項式非確定問題。

完全多項式非確定性問題可以用窮舉法得到答案,乙個個檢驗下去,最終便能得到結果。但是這樣演算法的複雜程度,是指數關係,因此計算的時間隨問題的複雜程度成指數的增長,很快便變得不可計算了。

人們發現,所有的完全多項式非確定性問題,都可以轉換為一類叫做滿足性問題的邏輯運算問題。既然這類問題的所有可能答案,都可以在多項式時間內計算,人們於是就猜想,是否這類問題,存在乙個確定性演算法,可以在指數時間內,直接算出或是搜尋出正確的答案呢?這就是著名的np=p?的猜想。

解決這個猜想,無非兩種可能,一種是找到乙個這樣的演算法,只要針對某個特定np完全問題找到乙個演算法,所有這類問題都可以迎刃而解了,因為他們可以轉化為同乙個問題。另外的一種可能,就是這樣的演算法是不存在的。那麼就要從數學理論上證明它為什麼不存在。

前段時間轟動世界的乙個數學成果,是幾個印度人提出了乙個新演算法,可以在多項式時間內,證明某個數是或者不是質數,而在這之前,人們認為質數的證明,是個非多項式問題。可見,有些看來好象是非多項式的問題,其實是多項式問題,只是人們一時還不知道它的多項式解而已。

如果判定問題π∈np,並且對所有其他判定問題 π∈np,都有π'多項式變換到π(記為π'∞π),則稱判定問題π 是np完全的。

對p類,np類及np完全問題的研究推動 了計算複雜性理論的發展,產生了許多新概念,提出了許多新方法。但是還有許多難題至今沒有解決,p=np?就是其中之一。許多學者猜想p≠np,但無法證明。

還有乙個就是虛函式繼承的問題,雖說做對了,但還是不太明白。。。

#include

using namespace std;

class a

void virtual print()

virtual ~a()

};class b:public a

void print()

~b()

};void main()

執行答案為:abba

如果把virtual ~a(){print();的virtual去掉,結果為:aba.  (慢慢琢磨了...)

還有個題目就是c++ traits方面的了,上面一篇大致在網上找了資料,還不太理解。

另外web方面的知識太欠缺,自己報了web職位,題目幾乎都不會,還好是選做。。。

值得欣慰的是資料庫方面的題目自己覺得做了不少(也是選做),算是補償吧。

最後總結一點:還是基礎最重要,另外一點就是要全面,光看以往的筆試題啊不太現實,抓緊時間看書了,馬上國慶放假了,哪兒也不去了。。。閉關修煉ing!(希望以後的求職路順利)

感慨一下,OI ACM

今天瞎逛幾個國內的online judge,在pku的rank list上看到大學隔壁宿舍一哥們的id。頓生景仰之情啊,我靠。rank 13,solved 1538 很有感慨,自己整個大學都沒有去參加acm,可能也是高中的oi讓我很不爽。回想一下當年自己高三上學期的時候,整天泡在學校機房,當時是做 ...

也來感慨一下

有一段時間沒有寫一點東西了。發現乙個問題,這兩三個月來,我有點變賴了,在那個整整忙了乙個月之後。今天,組長找我談話了,大概的意思是說,我最近變賴了。也是,這段時間,他也只顧著自己天天加班,然後我才有時間開點小差什麼的。今天好像他開始比較有空了,沒加班,晚上跟我一起坐車回來。路上,他跟我說,這段時間以...

感慨一下,已經很久沒感慨了

最近在做系統的改造,在這之前我們還做了另外乙個系統,這是背景。前兩天前端問我為什麼要做這個改造,為什麼一開始不這樣做,她覺得另外乙個系統做的就挺好,我覺得挺無語 我又不能決定一切 工作幾年越來越不喜歡爭論到底對還是錯,不想說太多話,第1個系統是在開發的時候基本上已經定好了,我雖然有過疑意,但是畢竟少...