導航:首頁 > 源碼編譯 > 區域覆蓋問題貪心演算法

區域覆蓋問題貪心演算法

發布時間:2023-08-22 20:34:11

㈠ acm競賽知識點

1. acm常用小知識點
acm常用小知識點 1.ACM 關於ACM程序設計競賽,需要掌握哪些知識點,最好能詳細一
訓練過ACM等程序設計競賽的人在演算法上有較大的優勢,這就說明當你編程能力提高之後,主要時間是花在思考演算法上,不是花在寫程序與debug上。

下面給個計劃你練練:第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡代碼,因為太常用,所以要練到寫時不用想,10-15分鍾內打完,甚至關掉顯示器都可以把程序打出來。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫) 3.大數(高精度)加減乘除4.二分查找. (代碼可在五行以內) 5.叉乘、判線段相交、然後寫個凸包. 6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡) 7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式. 8. 調用系統的qsort, 技巧很多,慢慢掌握. 9. 任意進制間的轉換第二階段:練習復雜一點,但也較常用的演算法。

如: 1. 二分圖匹配(匈牙利),最小路徑覆蓋 2. 網路流,最小費用流。 3. 線段樹. 4. 並查集。

5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp 6.博弈類演算法。博弈樹,二進製法等。

7.最大團,最大獨立集。 8.判斷點在多邊形內。

9. 差分約束系統. 10. 雙向廣度搜索、A*演算法,最小耗散優先.第三階段: 前兩個階段是打基礎,第三階段是鍛煉在比賽中可以快速建立模型、想新演算法。這就要平時多做做綜合的題型了。

1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。 2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來做:-P ) 3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力. 4. 一道題不要過了就算,問一下人,有更好的演算法也打一下。

5. 做過的題要記好 :-)下面轉自:ACMer必備知識(任重而道遠。)

圖論 路徑問題 0/1邊權最短路徑 BFS 非負邊權最短路徑(Dijkstra) 可以用Dijkstra解決問題的特徵 負邊權最短路徑 Bellman-Ford Bellman-Ford的Yen-氏優化 差分約束系統 Floyd 廣義路徑問題 傳遞閉包 極小極大距離 / 極大極小距離 Euler Path / Tour 圈套圈演算法 混合圖的 Euler Path / Tour Hamilton Path / Tour 特殊圖的Hamilton Path / Tour 構造 生成樹問題 最小生成樹 第k小生成樹 最優比率生成樹 0/1分數規劃 度限制生成樹 連通性問題 強大的DFS演算法 無向圖連通性 割點 割邊 二連通分支 有向圖連通性 強連通分支 2-SAT 最小點基 有向無環圖 拓撲排序 有向無環圖與動態規劃的關系 二分圖匹配問題 一般圖問題與二分圖問題的轉換思路 最大匹配 有向圖的最小路徑覆蓋 0 / 1矩陣的最小覆蓋 完備匹配 最優匹配 穩定婚姻 網路流問題 網路流模型的簡單特徵和與線性規劃的關系 最大流最小割定理 最大流問題 有上下界的最大流問題 循環流 最小費用最大流 / 最大費用最大流 弦圖的性質和判定組合數學 解決組合數學問題時常用的思想 逼近 遞推 / 動態規劃 概率問題 Polya定理計算幾何 / 解析幾何 計算幾何的核心:叉積 / 面積 解析幾何的主力:復數 基本形 點 直線,線段 多邊形 凸多邊形 / 凸包 凸包演算法的引進,卷包裹法 Graham掃描法 水平序的引進,共線凸包的補丁 完美凸包演算法 相關判定 兩直線相交 兩線段相交 點在任意多邊形內的判定 點在凸多邊形內的判定 經典問題 最小外接圓 近似O(n)的最小外接圓演算法 點集直徑 旋轉卡殼,對踵點 多邊形的三角剖分數學 / 數論 最大公約數 Euclid演算法 擴展的Euclid演算法 同餘方程 / 二元一次不定方程 同餘方程組 線性方程組 高斯消元法 解mod 2域上的線性方程組 整系數方程組的精確解法 矩陣 行列式的計算 利用矩陣乘法快速計算遞推關系 分數 分數樹 連分數逼近 數論計算 求N的約數個數 求phi(N) 求約數和 快速數論變換 …… 素數問題 概率判素演算法 概率因子分解數據結構 組織結構 二叉堆 左偏樹 二項樹 勝者樹 跳躍表 樣式圖標 斜堆 reap 統計結構 樹狀數組 虛二叉樹 線段樹 矩形面積並 圓形面積並 關系結構 Hash表 並查集 路徑壓縮思想的應用 STL中的數據結構 vector deque set / map動態規劃 / 記憶化搜索 動態規劃和記憶化搜索在思考方式上的區別 最長子序列系列問題 最長不下降子序列 最長公共子序列 最長公共不下降子序列 一類NP問題的動態規劃解法 樹型動態規劃 背包問題 動態規劃的優化 四邊形不等式 函數的凸凹性 狀態設計 規劃方向線性規劃常用思想 二分 最小表示法串 KMP Trie結構 後綴樹/後綴數組 LCA/RMQ 有限狀態自動機理論排序 選擇/冒泡 快速排序 堆排序 歸並排序 基數排序 拓撲排序 排序網路。
2.ACM需要具備什麼知識
ACM國際大學生程序設計競賽(ACM/ICPC :ACM International Collegiate Programming Contest)是由國際計算機界歷史悠久、頗具權威性的組織ACM( 美國計算機協會)學會(Association for puter Machineary)主辦,是世界上公認的規模最大、水平最高的國際大學生程序設計競賽,其目的旨在使大學生運用計算機來充分展示自已分析問題和解決問題的能力。該項競賽從1970年舉辦至今已歷25屆,因歷屆競賽都薈萃了世界各大洲的精英,雲集了計算機界的「希望之星」,而受到國際各知名大學的重視,並受到全世界各著名計算機公司如Microsoft(微軟公司) 、IBM等的高度關注,成為世界各國大學生最具影響力的國際級計算機類的賽事,ACM所頒發的獲獎證書也為世界各著名計算機公司、各知名大學所認可。

該項競賽是年度性競賽,分區域預賽和國際決賽兩個階段進行,各預賽區第一名自動獲得參加世界決賽的資格,世界決賽安排在每年的3~4月舉行,而區域預賽安排在上一年的9月~12月在各大洲舉行。從1998年開始,IBM公司連續5年獨家贊助該項賽事的世界決賽和區域預賽。這項比賽是以大學為單位組隊(每支隊由教練、3名正式隊員,一名後備隊員組成)參賽,要求在5個小時內,解決5~8到題目。

ACM/ICPC的區域預賽是規模很大,范圍很廣的賽事,近幾年,全世界有1000多所大學, 2000多支參賽隊在六大洲的28~30個賽站中爭奪世界決賽的60~66個名額,去年我校舉辦的區域預賽,就有來自50多所高校的100多支隊伍參加,其激烈程度可想而知。

與其他編程競賽相比,ACM/ICPC題目難度更大,更強調演算法的高效性,不僅要解決一個指定的命題,而且必需要以最佳的方式解決指定的命題;它涉及知識面廣,與大學計算機系本科以及研究生如程序設計、離散數學、數據結構、人工智慧、演算法分析與設計等相關課程直接關聯,對數學要求更高,由於採用英文命題,對英語要求高,ACM/ICPC採用3人合作、共用一台電腦,所以它更強調團隊協作精神;由於許多題目並無現成的演算法,需要具備創新的精神,ACM/ICPC不僅強調學科的基礎,更強調全面素質和能力的培養。ACM/ICPC是一種全封閉式的競賽,能對學生能力進行實時的全面的考察,其成績的真實性更強,所以目前已成為內地高校的一個熱點,是培養全面發展優秀人材的一項重要的活動。概括來說就是:強調演算法的高效性、知識面要廣、對數學和英語要求較高、團隊協作和創新精神。
3.ACM需要那些方面的知識
一、語言是最重要的基本功 無論側重於什麼方面,只要是通過計算機程序去最終實現的競賽,語言都是大家要 過的第一道關。

亞洲賽區的比賽支持的語言包括C/C++與JAVA。筆者首先說說JAVA,眾所 周知,作為面向對象的王牌語言,JAVA在大型工程的組織與安全性方面有著自己獨特的 優勢,但是對於信息學比賽的具體場合,JAVA則顯得不那麼合適,它對於輸入輸出流的 操作相比於C++要繁雜很多,更為重要的是JAVA程序的運行速度要比C++慢10倍以上,而 競賽中對於JAVA程序的運行時限卻往往得不到同等比例的放寬,這無疑對演算法設計提出 了更高的要求,是相當不利的。

其實,筆者並不主張大家在這種場合過多地運用面向對 象的程序設計思維,因為對於小程序來說這不旦需要花費更多的時間去編寫代碼,也會 降低程序的執行效率。 接著說C和C++。

許多現在參加講座的同學還在上大一,C的基礎知識剛剛學完,還沒 有接觸過C++,其實在賽場上使用純C的選手還是大有人在的,它們主要是看重了純C在效 率上的優勢,所以這部分同學如果時間有限,並不需要急著去學習新的語言,只要提高 了自己在演算法設計上的造詣,純C一樣能發揮巨大的威力。 而C++相對於C,在輸入輸出流上的封裝大大方便了我們的操作,同時降低了出錯的 可能性,並且能夠很好地實現標准流與文件流的切換,方便了調試的工作。

如果有些同 學比較在意這點,可以嘗試C和C++的混編,畢竟僅僅學習C++的流操作還是不花什麼時間 的。 C++的另一個支持來源於標准模版庫(STL),庫中提供的對於基本數據結構的統一 介面操作和基本演算法的實現可以縮減我們編寫代碼的長度,這可以節省一些時間。

但是 ,與此相對的,使用STL要在效率上做出一些犧牲,對於輸入規模很大的題目,有時候必 須放棄STL,這意味著我們不能存在「有了STL就可以不去管基本演算法的實現」的想法; 另外,熟練和恰當地使用STL必須經過一定時間的積累,准確地了解各種操作的時間復雜 度,切忌對STL中不熟悉的部分濫用,因為這其中蘊涵著許多初學者不易發現的陷阱。 通過以上的分析,我們可以看出僅就信息學競賽而言,對語言的掌握並不要求十分 全面,但是對於經常用到的部分,必須十分熟練,不允許有半點不清楚的地方,下面我 舉個真實的例子來說明這個道理——即使是一點很細微的語言障礙,都有可能釀成錯誤 : 在去年清華的賽區上,有一個隊在做F題的時候使用了cout和printf的混合輸出,由 於一個帶緩沖一個不帶,所以輸出一長就混亂了。

只是因為當時judge team中負責F題的 人眼睛尖,看出答案沒錯只是順序不對(答案有一頁多,是所有題目中最長的一個輸出 ),又看了看程序發現只是輸出問題就給了個Presentation error(格式錯)。如果審 題的人不是這樣而是直接給一個 Wrong Answer,相信這個隊是很難查到自己錯在什麼地 方的。

現在我們轉入第二個方面的討論,基礎學科知識的積累。 二、以數學為主的基礎知識十分重要 雖然被定性為程序設計競賽,但是參賽選手所遇到的問題更多的是沒有解決問題的 思路,而不是有了思路卻死活不能實現,這就是平時積累的基礎知識不夠。

今年World Final的總冠軍是波蘭華沙大學,其成員出自於數學系而非計算機系,這就是一個鮮活的 例子。競賽中對於基礎學科的涉及主要集中於數學,此外對於物理、電路等等也可能有 一定應用,但是不多。

因此,大一的同學也不必為自己還沒學數據結構而感到不知從何 入手提高,把數學撿起來吧!下面我來談談在競賽中應用的數學的主要分支。 1、離散數學——作為計算機學科的基礎,離散數學是競賽中涉及最多的數學分支, 其重中之重又在於圖論和組合數學,尤其是圖論。

圖論之所以運用最多是因為它的變化最多,而且可以輕易地結合基本數據結構和許 多演算法的基本思想,較多用到的知識包括連通性判斷、DFS和BFS,關節點和關鍵路徑、歐拉迴路、最小生成樹、最短路徑、二部圖匹配和網路流等等。雖然這部分的比重很大 ,但是往往也是競賽中的難題所在,如果有初學者對於這部分的某些具體內容暫時感到 力不從心,也不必著急,可以慢慢積累。

競賽中設計的組合計數問題大都需要用組合數學來解決,組合數學中的知識相比於 圖論要簡單一些,很多知識對於小學上過奧校的同學來說已經十分熟悉,但是也有一些 部分需要先對代數結構中的群論有初步了解才能進行學習。組合數學在競賽中很少以難 題的形式出現,但是如果積累不夠,任何一道這方面的題目卻都有可能成為難題。

2、數論——以素數判斷和同餘為模型構造出來的題目往往需要較多的數論知識來解 決,這部分在競賽中的比重並不大,但只要來上一道,也足以使知識不足的人冥思苦想 上一陣時間。素數判斷和同餘最常見的是在以密碼學為背景的題目中出現,在運用密碼 學常識確定大概的過程之後,核心演算法往往要涉及數論的內容。

3、計算幾何——計算幾何相比於其它部分來說是比較獨立的,就是說它和其它的知 識點很少有過多的結合,較常用到的部分包括——線段相交的判斷、多邊形面積的計算 、內點外點的判斷、凸包等。
4.ACM需要那些方面的知識
一、語言是最重要的基本功 無論側重於什麼方面,只要是通過計算機程序去最終實現的競賽,語言都是大家要 過的第一道關。

亞洲賽區的比賽支持的語言包括C/C++與JAVA。筆者首先說說JAVA,眾所 周知,作為面向對象的王牌語言,JAVA在大型工程的組織與安全性方面有著自己獨特的 優勢,但是對於信息學比賽的具體場合,JAVA則顯得不那麼合適,它對於輸入輸出流的 操作相比於C++要繁雜很多,更為重要的是JAVA程序的運行速度要比C++慢10倍以上,而 競賽中對於JAVA程序的運行時限卻往往得不到同等比例的放寬,這無疑對演算法設計提出 了更高的要求,是相當不利的。

其實,筆者並不主張大家在這種場合過多地運用面向對 象的程序設計思維,因為對於小程序來說這不旦需要花費更多的時間去編寫代碼,也會 降低程序的執行效率。 接著說C和C++。

許多現在參加講座的同學還在上大一,C的基礎知識剛剛學完,還沒 有接觸過C++,其實在賽場上使用純C的選手還是大有人在的,它們主要是看重了純C在效 率上的優勢,所以這部分同學如果時間有限,並不需要急著去學習新的語言,只要提高 了自己在演算法設計上的造詣,純C一樣能發揮巨大的威力。 而C++相對於C,在輸入輸出流上的封裝大大方便了我們的操作,同時降低了出錯的 可能性,並且能夠很好地實現標准流與文件流的切換,方便了調試的工作。

如果有些同 學比較在意這點,可以嘗試C和C++的混編,畢竟僅僅學習C++的流操作還是不花什麼時間 的。 C++的另一個支持來源於標准模版庫(STL),庫中提供的對於基本數據結構的統一 介面操作和基本演算法的實現可以縮減我們編寫代碼的長度,這可以節省一些時間。

但是 ,與此相對的,使用STL要在效率上做出一些犧牲,對於輸入規模很大的題目,有時候必 須放棄STL,這意味著我們不能存在「有了STL就可以不去管基本演算法的實現」的想法; 另外,熟練和恰當地使用STL必須經過一定時間的積累,准確地了解各種操作的時間復雜 度,切忌對STL中不熟悉的部分濫用,因為這其中蘊涵著許多初學者不易發現的陷阱。 通過以上的分析,我們可以看出僅就信息學競賽而言,對語言的掌握並不要求十分 全面,但是對於經常用到的部分,必須十分熟練,不允許有半點不清楚的地方,下面我 舉個真實的例子來說明這個道理——即使是一點很細微的語言障礙,都有可能釀成錯誤 : 在去年清華的賽區上,有一個隊在做F題的時候使用了cout和printf的混合輸出,由 於一個帶緩沖一個不帶,所以輸出一長就混亂了。

只是因為當時judge team中負責F題的 人眼睛尖,看出答案沒錯只是順序不對(答案有一頁多,是所有題目中最長的一個輸出 ),又看了看程序發現只是輸出問題就給了個Presentation error(格式錯)。如果審 題的人不是這樣而是直接給一個 Wrong Answer,相信這個隊是很難查到自己錯在什麼地 方的。

現在我們轉入第二個方面的討論,基礎學科知識的積累。 二、以數學為主的基礎知識十分重要 雖然被定性為程序設計競賽,但是參賽選手所遇到的問題更多的是沒有解決問題的 思路,而不是有了思路卻死活不能實現,這就是平時積累的基礎知識不夠。

今年World Final的總冠軍是波蘭華沙大學,其成員出自於數學系而非計算機系,這就是一個鮮活的 例子。競賽中對於基礎學科的涉及主要集中於數學,此外對於物理、電路等等也可能有 一定應用,但是不多。

因此,大一的同學也不必為自己還沒學數據結構而感到不知從何 入手提高,把數學撿起來吧!下面我來談談在競賽中應用的數學的主要分支。 1、離散數學——作為計算機學科的基礎,離散數學是競賽中涉及最多的數學分支, 其重中之重又在於圖論和組合數學,尤其是圖論。

圖論之所以運用最多是因為它的變化最多,而且可以輕易地結合基本數據結構和許 多演算法的基本思想,較多用到的知識包括連通性判斷、DFS和BFS,關節點和關鍵路徑、歐拉迴路、最小生成樹、最短路徑、二部圖匹配和網路流等等。雖然這部分的比重很大 ,但是往往也是競賽中的難題所在,如果有初學者對於這部分的某些具體內容暫時感到 力不從心,也不必著急,可以慢慢積累。

競賽中設計的組合計數問題大都需要用組合數學來解決,組合數學中的知識相比於 圖論要簡單一些,很多知識對於小學上過奧校的同學來說已經十分熟悉,但是也有一些 部分需要先對代數結構中的群論有初步了解才能進行學習。組合數學在競賽中很少以難 題的形式出現,但是如果積累不夠,任何一道這方面的題目卻都有可能成為難題。

2、數論——以素數判斷和同餘為模型構造出來的題目往往需要較多的數論知識來解 決,這部分在競賽中的比重並不大,但只要來上一道,也足以使知識不足的人冥思苦想 上一陣時間。素數判斷和同餘最常見的是在以密碼學為背景的題目中出現,在運用密碼 學常識確定大概的過程之後,核心演算法往往要涉及數論的內容。

3、計算幾何——計算幾何相比於其它部分來說是比較獨立的,就是說它和其它的知 識點很少有過多的結合,較常用到的部分包括——線段相交的判斷、多邊形面積的計算 、內點外點的判斷、凸包等。
5.ACM需要具備什麼知識
ACM國際大學生程序設計競賽(ACM/ICPC :ACM International Collegiate Programming Contest)是由國際計算機界歷史悠久、頗具權威性的組織ACM( 美國計算機協會)學會(Association for puter Machineary)主辦,是世界上公認的規模最大、水平最高的國際大學生程序設計競賽,其目的旨在使大學生運用計算機來充分展示自已分析問題和解決問題的能力。該項競賽從1970年舉辦至今已歷25屆,因歷屆競賽都薈萃了世界各大洲的精英,雲集了計算機界的「希望之星」,而受到國際各知名大學的重視,並受到全世界各著名計算機公司如Microsoft(微軟公司) 、IBM等的高度關注,成為世界各國大學生最具影響力的國際級計算機類的賽事,ACM所頒發的獲獎證書也為世界各著名計算機公司、各知名大學所認可。

該項競賽是年度性競賽,分區域預賽和國際決賽兩個階段進行,各預賽區第一名自動獲得參加世界決賽的資格,世界決賽安排在每年的3~4月舉行,而區域預賽安排在上一年的9月~12月在各大洲舉行。從1998年開始,IBM公司連續5年獨家贊助該項賽事的世界決賽和區域預賽。這項比賽是以大學為單位組隊(每支隊由教練、3名正式隊員,一名後備隊員組成)參賽,要求在5個小時內,解決5~8到題目。

ACM/ICPC的區域預賽是規模很大,范圍很廣的賽事,近幾年,全世界有1000多所大學, 2000多支參賽隊在六大洲的28~30個賽站中爭奪世界決賽的60~66個名額,去年我校舉辦的區域預賽,就有來自50多所高校的100多支隊伍參加,其激烈程度可想而知。

與其他編程競賽相比,ACM/ICPC題目難度更大,更強調演算法的高效性,不僅要解決一個指定的命題,而且必需要以最佳的方式解決指定的命題;它涉及知識面廣,與大學計算機系本科以及研究生如程序設計、離散數學、數據結構、人工智慧、演算法分析與設計等相關課程直接關聯,對數學要求更高,由於採用英文命題,對英語要求高,ACM/ICPC採用3人合作、共用一台電腦,所以它更強調團隊協作精神;由於許多題目並無現成的演算法,需要具備創新的精神,ACM/ICPC不僅強調學科的基礎,更強調全面素質和能力的培養。ACM/ICPC是一種全封閉式的競賽,能對學生能力進行實時的全面的考察,其成績的真實性更強,所以目前已成為內地高校的一個熱點,是培養全面發展優秀人材的一項重要的活動。概括來說就是:強調演算法的高效性、知識面要廣、對數學和英語要求較高、團隊協作和創新精神。
6.ACM常用的經典演算法
大概分為數論演算法,圖論演算法,A*演算法。

數論演算法:

排序(選擇,冒泡,快速,歸並,堆,基數,桶排序等)

遞歸,回溯

概率,隨機

公約數,素數

因數分解

矩陣運算

線性規劃

最小二乘

微積分

多項式分解和級數

圖論演算法:

哈夫曼樹(即最優二叉樹)

哈希表

Prim,Kruskal演算法(即最小生成樹演算法)

紅黑樹

a-B剪枝法

深、廣度搜索

拓撲排序

強連通分量

Dijkstra,Bellman-Ford,Floyd-Warashall演算法(最短路徑演算法)

計算幾何(線段相交,凸包,最近點對)

A*演算法:

動態規劃

貪心演算法

KMP演算法

哈密頓迴路問題

子集問題

博弈(極大極小值演算法等)
7.參加ACM需要准備哪些知識
學ACM要熟練C語言的基礎語法,對編程有很大的興趣,還要學關於數據結構的知識。

內容大多數是考數據結構,例如:深度搜索(dfs)、廣度搜索(bfs)、並查集、母函數、最小生成樹、數論、動態規劃(重點)、背包問題、最短路、網路流……還有很多演算法,我列出這些是經常考到的,我也在學習上述所說的。 最好買一本《數據結構》或者關於演算法的書看看,看完一些要自己動手實踐做題,做題的話去杭電acm做題,裡面有很多很基礎的題,不錯的。

資料的話,網路有很多,我多數都是網路或者 *** ,還有可以看看別人的博客的解題報告,裡面有詳細的介紹,不懂還可以問問同學師兄的。 對了,還有一點,acm比賽都是英文題目的,比賽時帶本字典查吧。

希望我說的你能滿意,祝你能在acm方面有所收獲。

㈡ 數據結構面試常見問題

數據結構面試常見問題

數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。下面就是我整理的數據結構面試常見問題,一起來看一下吧。

數據結構面試常見問題 篇1

數據結構與演算法,這個部分的內容其實是十分的龐大,要想都覆蓋到不太容易。在校學習階段我們可能需要對每種結構,每種演算法都學習,但是找工作筆試或者面試的燃銀坦時候,要在很短的時間內考察一個人這方面的能力,把每種結構和演算法都問一遍不太現實。所以,實際的情況是,企業一般考察一些看起來很基本的概念和演算法,或者是一些變形,然後讓你去實現。搏彎也許看起來簡單,但是如果真讓你在紙上或者是計算機上快速地完成一個演算法,並且設計測試案例,最後跑起來,你就會發現會很難了。這就要求我們要熟悉,並牢固掌握常用的演算法,特別是那些看起來貌似簡單的演算法,正是這些用起來很普遍的演算法,才要求我們能很扎實的掌握,在實際工作中提高工作效率。遇到復雜的演算法,通過分析和扎實的基本功,應該可以很快地進行開發。

閑話少說,下面進入正題。

一.數據結構部分

1.數組和鏈表的區別。(很簡單,但是很常考,記得要回答全面)

C++語言中可以用數組處理一組數據類型相同的數據,但不允許動態定義數組的大小,即在使用數組之前必須確定數組的大小。而在實際應用中,用戶使用數組之前有時無法准確確定數組的大小,只能將數組定義成足夠大小,這樣數組中有些空間可能不被使用,從而造成內存空間的浪費。鏈表是一種常見的數據組織形式,它採用動態分配內存的形式實現。需要時可以用new分配內存空間,不需要時用將已分配的空間釋放,不會造成內存空間的浪費。

從邏輯結構來看:數組必須事先定義固定的長度(元素個數),不能適應數據動態地增減的情況,即數組的大小一旦定義就不能改變。當數據增加時,可能超出原先定義的元素個數;當數據減少時,造成內存浪費;鏈表動態地進行存儲分配,可以適應數據動態地增減的.情況,且可以方便地插入、刪除數據項。(數組中插入、刪除數據項時,需要移動其它數據項)。

從內存存儲來看:(靜態)數組從棧中分配空間(用NEW創建的在堆中), 對於程序員方便快速,但是自由度小;鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩.

1.從訪問方式來看:數組在內存中是連續存儲的,因此,可以利用下標索引進行隨機訪問;鏈表是鏈式存儲結構,在訪問元素的時候只能通過線性的方式由前到後順序訪問,所以訪問效率比數組要低。

2.鏈表的一些操作,如鏈表的反轉,鏈表存在環路的判斷(快慢指針),雙向鏈表,循環鏈表相關操作。

3.隊列(特殊的如優先順序隊列),棧的應用。(比如隊列用在消息隊列,棧用在遞歸調用中)

4.二叉樹的基本操作

二叉樹的三種遍歷方式(前序,中序,後序)及其遞歸和非遞歸實皮桐現,三種遍歷方式的主要應用(如後綴表達式等)。相關操作的時間復雜度。

5.字元串相關

整數,浮點數和字元串之間的轉換(atoi,atof,itoa)

字元串拷貝注意異常檢查,比如空指針,字元串重疊,自賦值,字元串結束符'/0'等。

二.演算法部分

1.排序演算法:

排序可以算是最基本的,最常用的演算法,也是筆試面試中最常被考察到的演算法。最基本的冒泡排序,選擇排序,插入排序要可以很快的用代碼實現,這些主要考察你的實際編碼能力。堆排序,歸並排序,快排序,這些演算法需要熟悉主要的思想,和需要注意的細節地方。需要熟悉常用排序演算法的時間和空間復雜度。

各種排序演算法的使用范圍總結:

(1)當數據規模較小的時候,可以用簡單的排序演算法如直接插入排序或直接選擇排序。

(2)當文件的初態已經基本有序時,可以用直接插入排序或冒泡排序。

(3)當數據規模比較大時,應用速度快的排序演算法。可以考慮用快速排序。當記錄隨機分布的時候,快排的平均時間最短,但可能出現最壞的情況,這時候的時間復雜度是O(n^2),且遞歸深度為n,所需的棧空間問O(n)。

(4)堆排序不會出現快排那樣的最壞情況,且堆排序所需的輔助空間比快排要少。但這兩種演算法都不是穩定的,若要求排序時穩定的,可以考慮用歸並排序。

(5)歸並排序可以用於內排序,也可以用於外排序。在外排序時,通常採用多路歸並,並且通過解決長順串的合並,產生長的初始串,提高主機與外設並行能力等措施,以減少訪問外存額次數,提高外排序的效率。

2,查找演算法

能夠熟練寫出或者是上機編碼出二分查找的程序。

3.hash演算法

4.一些演算法設計思想。

貪心演算法,分治演算法,動態規劃演算法,隨機化演算法,回溯演算法等。這些可以根據具體的例子程序來復習。

5.STL

STL(Standard Template Library)是一個C++領域中,用模版技術實現的數據結構和演算法庫,已經包含在了C++標准庫中。其中的vecor,list,stack,queue等結構不僅擁有更強大的功能,還有了更高的安全性。除了數據結構外,STL還包含泛化了的迭代器,和運行在迭代器上的各種實用演算法。這些對於對性能要求不是太高,但又不希望自己從底層實現演算法的應用還是很具有誘惑力的。

數據結構面試常見問題 篇2

1. 什麼是數據結構?

數據結構是數據組織(存儲)和操作進行檢索和訪問的方式。它還定義了不同數據集相互關聯、建立關系和形成演算法的方式。

2. 描述數據結構的類型?

列表:鏈接到先前或/和後續數據項的相關事物的集合。

數組:所有相同的值的集合。

Records:欄位的集合,每個欄位都包含來自單一數據類型的數據。

樹:在分層框架中組織數據的數據結構。這種形式的數據結構遵循數據項插入、刪除和修改的順序。

表格:數據以行和列的形式保存。這些與記錄相當,因為數據的結果或更改反映在整個表中。

3. 什麼是線性數據結構?請舉例

如果數據結構的所有元素或數據項都按順序或線性順序排列,則數據結構是線性的。元素以非分層方式存儲,因此除了列表中的第一個和最後一個元素外,每個項目都有後繼者和前驅者。數組、堆棧、字元串、隊列和鏈表,都屬於線性數據結構。

4. 數據結構有哪些應用?

數值分析、操作系統、人工智慧、編譯器設計、資料庫管理、圖形、統計分析和模擬。

5、文件結構和存儲結構有什麼區別?

區別在於訪問的內存區域。存儲結構是指計算機系統內存中的數據結構,而文件結構是指輔助存儲器中的存儲結構。

6、什麼是多維數組?

多維數組的意思是指三維或者三維以上的數組。 三維數組具有高、寬、深的概念,或者說行、列、層的概念,即數組嵌套數組達到三維及其以上。是最常見的多維數組,由於其可以用來描述三維空間中的位置或狀態而被廣泛使用。

7. 什麼是鏈表數據結構?

這是最常見的數據結構面試問題之一,面試官希望你能給出全面的答案。嘗試盡可能多地解釋,而不是用一句話來完成你的答案!

它是一個線性數據結構或一系列數據對象,其中元素不存儲在相鄰的內存位置。元素使用指針鏈接以形成鏈。每個元素都是一個單獨的對象,稱為節點。每個節點有兩項:數據欄位和對下一個節點的引用。鏈表中的入口點稱為頭。如果列表為空,則頭部為空引用,最後一個節點具有對空的引用。

一個鏈表是一個動態的數據結構,其中節點的數量是不固定的,這樣的例子有擴大和縮小需求的能力。

它適用於以下情況:

我們處理未知數量的對象或不知道列表中有多少項目;

我們需要從列表中進行恆定時間的插入/刪除,就像在時間可預測性至關重要的實時計算中一樣;

不需要隨機訪問任何元素;

該演算法需要一個數據結構,無論對象在內存中的物理地址如何,都需要在其中存儲對象;

我們需要在列表中間插入項目,就像在優先隊列中一樣;

一些實現是堆棧和隊列、圖形、名稱目錄、動態內存分配以及對長整數執行算術運算

8.什麼是雙向鏈表?請舉例

它是鏈表的一種復雜類型(雙端 LL),其中一個節點有兩個鏈接,一個連接到序列中的下一個節點,另一個連接到前一個節點。這允許在兩個方向上遍歷數據元素。

舉例:

帶有下一個和上一個導航按鈕的音樂播放列表

具有 BACK-FORWARD 訪問頁面的瀏覽器緩存

瀏覽器上的撤消功能

9. 為什麼要做演算法分析?

一個問題可以使用多種解決演算法以多種方式解決。演算法分析提供對演算法所需資源的估計,以解決特定的計算問題。還確定了執行所需的時間和空間資源量。

演算法的時間復雜度量化了演算法運行所花費的時間,作為輸入長度的函數。空間復雜度量化了演算法佔用的空間或內存量,以作為輸入長度的函數運行。

;

㈢ 關於部署的一些經典演算法

根據部署方式的不同,節點部署演算法可分可為 確定性部署 和 隨機性部署 兩大類。確定性部署通常應用於環境友好或網路狀態較為穩定的應用中,感測器節點根據應用需求被置於經過計算和安排後所確定的位置上,通過將節點部署問題抽象為數學問題中的線性規劃問題,以網路性能或成本最優化為目標而提出解決方案[19];而隨機部署則較為適用於環境惡劣或人工無法到達的監控環境中,感測器節點通常以拋灑的方式隨機分布在目標區域內,節點位置往往是無法確定的。

確定性部署相比隨機部署來說具有較優的網路性能,但在規模較大且應用環境十分惡劣的實際部署應用中,確定飢凳顫性部署往往佔用了較高的人力成本和時間成本,而隨機部署則充分體現了其簡單和高效的優點,但同時,目標區域的覆蓋性能卻無法得到保證。

確定性部署被廣泛應用於水下感測器網路。針對水下三維環境的節點部署問題,Pori等人提出了從二維空間到三維空間部署策略的適應性演算法,文獻[20]圍繞著三維空間內的節點部署問題和規劃,提出了一系列有效構建三維網路拓撲結構的規則,通過轉換為二維問題來實現三維空間的節點部署問題。

在文獻[21]中,作者通過計算得出網格部署模型下,滿足基本網路覆蓋和連通所需要爛敗的活動節點數目,該演算法為節點部署提供了理論基礎,缺點是該方法只可適用於二維環境下的節點部署,無法滿足水下無線感測器網路這種具有三維特性的應用需求。

最大平均覆蓋演算法(MAX_AVG_COV) 與 最大最小覆蓋演算法(MAX_MIN_COV) [22]的提出是基於網格部署模型,通過貪心演算法策略進行節點部署,根據前驅節點的位置信息,決定下一個節點的布置位置。兩種演算法都旨在實現最佳網路覆蓋,最大平均覆蓋演算法(MAX_AVG_COV)的目標是最大化網格點的平均覆蓋效果,演算法考慮的是整體網路的覆蓋效果;而最大最小覆蓋演算法(MAX_MIN_COV)的目標是使得網路中覆蓋效果較差的網格點的覆蓋效果最大化,演算法從優先改善網路局部性能的角度出發,優先把感測器放在性能最差的點上。兩種演算法用於概率感知模型,節點對目標事件的感知概率隨著目標事件與節點間距離而變化,演算法未能充分考慮冗餘覆蓋的問題,使得網路性能未能達到最佳表現,同時,兩種演算法復雜都較高,為 O(n^4)。

在文獻[22]的基礎上,藺智挺等學者提出了一種整體-局部增進演算法[23],該演算法的特點是網路初始化後,演算法迭代運行,粗行並且每次運行都放置一個感測器到感測器區域中,直到目標區域內所有點都滿足覆蓋要求或是已配置的感測器數目已達到能配置的感測器的數目的極限時才停止。在每次迭代過程中,演算法尋找使網路整體有效覆蓋性能改變最大的點,剔除局部冗餘,提升了網路的整體性能。

當目標區域的環境十分惡劣時,比如戰爭區域、災害防禦地區、或是人類無法靠近的深海等,又或者在進行大規模的網路部署時,節點數目巨大,分布密集,這樣的條件下採用確定性部署方式進行網路部署是不實際的甚至不可行的,此時,唯一可採用的方式是利用飛機、大炮等工具將節點以隨機方式拋灑至目標區域,節點自組織成網路。

2001 年,作者 González-Banos 在文獻[24]中提出了一種基於藝術畫廊看守問題的隨機部署策略,根據密度公式將感測器節點的位置以極坐標的表示方式建立了一種 R-random 的部署模型,它使用 R 來表示感測器節點與匯聚基站的距離。由於藝術畫廊看守問題旨在解決有限邊界內的最少覆蓋問題,因此該文獻在容錯方面具有較好的性能,模擬實驗表明了 R-random部署節點提升了整個感測器網路的可靠性。由於網路都採用多跳方式傳輸數據,因此越靠近基站的節點其能耗則越大,所以需在基站周圍部署密度較大的節點以實現大量冗餘節點,替代那些因能耗殆盡而死亡的節點,以此提升網路生存期,並保障數據的連通性。

在文獻[25]中,作者提出了一種加權的節點隨機配置演算法,解決了在不同的區域內節點耗能速率不同的問題,也就是增加中繼節點密度,使更多的中繼節點分擔負載,這樣可以延長網路的平均生命周期。但改演算法將大量的中繼節點部署於距離基站較遠的位置,因此網路的連通性將會受到影響。

雖然採用隨機部署方式從某種程度上可提高部署效率並減少人工成本,但節點在網路中的相對坐標無法確定,因而這種部署方式無法保證目標區域具有良好的覆蓋效果。因此在確定性部署與隨機部署二者之間的選擇上,Zhang H [26]圍繞著確定性部署與隨機部署兩種方式究竟孰優孰劣的問題,分析並研究了實現一定程度的覆蓋度所需的節點數目,作者分別考查了泊松分布、均勻隨機分布、網格分布三種部署策略下維護網路 K 覆蓋所需的節點密度,文章最後指出,採用網格部署方式所需的節點密度小於另外兩種隨機部署策略所需的節點密度,證明了網格部署策略在同等條件下所需的節點數目要優於隨機部署策略。

在第二章,我們論述了部署方案的評價指標分別有良好的區域覆蓋能力、數據信息的可達性和較長的網路生存期。本節將針對部署演算法的這三個評價指標的優化對象的不同,從基於覆蓋的部署、基於網路連通的部署和基於能量有效性的部署三個類別來對現有演算法研究成果進行論述。

實現目標區域的覆蓋面積最大化是無線感測器網路部署問題的基本目標,因此區域覆蓋也已經成為了許多學者研究的出發點。針對目前 WSNs 應用中經濟成本和客觀環境的限制,在文獻[27]中,作者研究了隨機部署方式下有限無線感測器網路在目標區域內的覆蓋概率的最大值和最小值,並提出了線性網路環境下實現最大覆蓋概率的部署策略,但該部署策略僅適用於線性網路下對移動目標的監測環境。文獻[28]將區域覆蓋問題劃分為面積覆蓋、點覆蓋和柵欄覆蓋問題三大類並分別進行了闡述,面積覆蓋問題主要研究的是如何實現覆蓋面積最大化的問題;點覆蓋旨在考查實現網路中個別目標的覆蓋問題;柵欄覆蓋的研究目標是如何降
低未知入侵發生的概率,它涉及運動檢測。

文獻[29]使用網格方法來進行覆蓋率的計算,覆蓋率的估算通過目標區域中被節點所覆蓋的網格數與目標區域的網格總數量之比實現,目標區域所劃分的網格數目決定了覆蓋率的計算復雜度和結果的精確度,網格被劃分得越細,最後計算所得的覆蓋率其精確度越高,當然計算過程的開銷也更大,如圖 3.1 所示,同樣 6 個節點,網格劃分為 4×4 時所計算得出的覆蓋率為 100%,而劃分為 8×8 時所得的覆蓋率為 98%。

文獻[10]針對水下無線感測器網路的應用特性,提出一種節點可自我進行深度調節的演算法,節點通過深度調節機制調整其在水下的深度,以實現水下三維環境覆蓋率的最大化。初始階段被部署與水底環境的各個感測器節點通過各自的 ID 號選取簇首節點,簇首節點負責通知該簇內其他節點的調節深度,通過判斷節點間是否存在覆蓋重疊區域來對節點進行分組管理,存在覆蓋重疊的節點彼此分至不同的組號中,組號決定了節點將來被分配至水中的深度;待分組結束後,節點根據自己所在的組號移至水中相應的深度。該演算法假設節點在水下環境只具備垂直方向上的移動性,由於簇首擔當了對簇內其他成員節點轉發管理指令的職責,因而造成了簇首節點的能耗將大於成員節點,而簇首節點的選舉在只可在網路初始階段即節點處於水底二維環境下進行,若簇首節點的死亡將造成整個簇內成員節點的癱瘓。

良好的網路連通性能夠保證感測節點所採集到的信息准確及時的傳遞到使用終端。目前的研究文獻中,關於網路連通性的問題多是在實現覆蓋的前提下,通過增大節點通信半徑來實現的,例如當 RT是 RS的比例 r>1 時,只需實現良好的網路覆蓋,節點之間的連通性就能得到保障。然而,在節點通信能力相比感知能力較差的情況下,例如 RT=RS的情況下,網路的連通性能則無法得到保障。

文獻[15]圍繞著多連通問題展開研究,結合三維空間部署特性和對點陣模式的研究,提出了三維空間下實現 1-連通、2-連通 3-連通、4-連通的部署模型。文章所提的部署模型基於點陣模式,通過對相應模型中節點的通信半徑和感知半徑之間關系的研究,考查節點部署位置對網路中 K 連通效果的影響,該文所提出的最優模型實際是以 RT/RS比例為前提,在相應的RT/RS比例關系下,對應相應的模型,其最優性限制於節點通信半徑與感知半徑間的比例關系。

節點的分布密度和其在網路中所處的位置通常會直接影響到整體網路的生命周期,在節點分布過於密集的情況下,數據通信鏈路容易出現擁塞,使得網路傳輸負載失衡,從而造成通信負載瓶頸;另外,由於網路多採用多跳方式進行數據轉發,因此在節點均勻分布的情況下,靠近基站的節點的能量耗損速度相對較快,從而造成整個網路的能量瓶頸問題。

文獻[30]研究了具有最大生存期節點的部署問題。作者提出一種模型使得每個節點可以周期性地向基站發送數據報告。將每個周期數據採集所需的能耗作為衡量網路生命周期長短的標准,作者把問題轉化為通過平衡節點負載,最小化每個節點每輪的平均能耗。文章假設網路採用大量的感測節點來傳送探測數據,並且謹慎的選擇後繼節點使得數據傳送所需的總能量最小。一種有效的演算法是重新部署節點,從而形成最有效的拓撲結構。節點按其接近興趣點的程度,被按降序挑選出來,演算法在所有的感測器節點之間迭代,在每一步迭代中,感測器節點檢查自己是否能作為後繼節點傳輸數據。新地址的選擇是基於運輸流量,實際上,節點的重新部署是通過接近下游鄰節點的方式以降低能量消耗。只有在網路的覆蓋性不受影響的情況下,才允許重新部署感測器節點[31]。

在文獻[32]中,節點在「休眠」-「活躍」兩種狀態間轉換,在滿足應用需求的前提下,非必要節點進入休眠狀態,而其餘節點繼續保持活躍狀態繼續為網路服務;若因節點能量耗盡而退出網路,或應用需求的改變使得當前活躍節點數量無法滿足應用需求,休眠節點進入活動狀態。作者提出了一種可根據網路狀態對節點進行動態管理的協議,以實現應用所規定的覆蓋率和連通度目標,並對節點狀態進行管理。通過幾何關系的研究,考查覆蓋率和連通率間的關系,並結合 SPAN 協議為網路覆蓋率和連通率提供保障。

文獻[33]研究了節點密度對網路生命期的影響,作者從部署角度考慮,分析得出網路生命期的解析公式。並通過研究發現網路生命期並非隨節點數量的增加而成比例的增長,因此需要仔細篩選一定數量的節點來平衡網路的成本。考慮到當第一個節點死亡時網路就會中斷,作者將問題轉化為確定節點的數目並確定它們的位置來保持網路長時間運行。最後提出了兩步的解決方案。首先,固定感測器節點的數量,通過多變數非線性問題來解決網路的優化部署,使其達到最長的網路生命期;然後,減少感測器節點數量同時實現最長網路生命期。該文獻以固定感測器節點數目為前提,考察節點在網路中的位置,以形成生命期最長的網路拓撲結[31]。

靜態網路的運行模式通常是通過預先設定的路由線路傳遞數據,在進行節點部署工作之前,首先根據應用特性和節點在網路中所發揮的作用來確定其在網路中所處的位置,待部署方案確定之後,方案將獨立於網路的狀態並且貫穿於整個網路生命周期內。在目前的應用中,可將節點按功能大致地分為四類:感測節點、中繼節點、簇首節點和基站節點(匯聚節點)。

靜態部署演算法的缺點僅在網路初始階段進行節點位置預判斷,而節點的最佳位置的評估往往與網路的數據傳輸率、節點的感知能力、數據路徑距離大小等因素息息相關,靜態部署方式往往不考慮節點部署後的移動情況,因此無法根據應用需求對網路部署進行修補以改善網路性能。

文獻[34]對異構網路下的節點進行確定性部署分析,採用分簇下的節點部署方案,網路中存在兩種節點,一種是普通節點(Regular Sensor Nodes, R-SN),這類節點受通信、存儲能量和計算方面的限制。另一類是高端復雜節點(High-endsophisticated sensor nodes,H-SN),即簇頭節點,這類節點具有充分的資源。

在某些情況下網路狀態是變化的,例如當新節點的加入或某節點能量耗盡時,網路拓撲結構和網路生存期會相應地發生變化,而靜態部署策略並未能考慮到網路運行的這些動態變化,因此,為了適應網路的這種變化以實現網路性能的優化,需考慮採用動態方式。

在文獻[35]中,節點具有移動性,待部署於目標區域後,各節點利用各自的排斥力朝著與鄰節點相反的方向移動直至節點所受的來自各方向的排斥力達到平衡,因而這種方法減少了節點間的覆蓋重疊區域。然而這也必然增加了節點的能耗,同時,該文獻並未考慮網路的連通性。2005 年,作者 Howard 在文獻[35]的基礎上延伸了對網路連通率的研究[36],考查節點通信范圍內的鄰居節點數目並以節點間的吸引力來保證網路的連通性能。文獻[35,36]演算法的優點是執行起來簡單易行,無須對環境進行預處理,且演算法具有較強的魯棒性,適用於大規模的節點部署應用;缺點是網路過於依賴節點的移動性,節點的能耗將是一個十分嚴重的問題。

類似地,Zou 和 Chakrabarty 學者所提出的 VFA 演算法也是基於節點移動功能模塊的增加[37],然而不同於文獻[35]採用的一次性對節點進行移動,VFA 首先進行移動的模擬模擬,在確定移動後節點所處的位置後,節點一次性地移至該點,節點間移動距離的計算通過簇首節點完成,節點不單具有排斥力,還具有相互間的吸引力,在節點間距過密是通過排斥力擴大覆蓋面積;當節點間距過疏時通過吸引力減少覆蓋漏洞。該演算法簡單易用,可實現目標區域快速覆蓋,部署效率較高,演算法復雜度根據節點數目和目標區域面積變化,在劃分為 n×m個網格的給定區域內部署 k 各節點的演算法復雜度為 O(nmk)。

文獻[9]引入一種新的感測器網路結構,提出了基於表面隨機配置的水下無線感測器網路節點部署方法:在進行網路初始配置時,在水平面上隨機布置一定數量的節點,然後根據每個節點調整空間內的鄰居節點深度安排其自身深度,盡可能使水下三維空間得到充分的覆蓋。

閱讀全文

與區域覆蓋問題貪心演算法相關的資料

熱點內容
伺服器上如何查看伺服器的埠 瀏覽:676
單片機伺服器編譯 瀏覽:768
單口usb列印機伺服器是什麼 瀏覽:859
戰地五開伺服器要什麼條件 瀏覽:954
在word中壓縮圖片大小 瀏覽:253
javatomcat圖片 瀏覽:417
程序員生產智能創意 瀏覽:65
匯和銀行app怎麼登錄 瀏覽:383
騰訊伺服器如何上傳源碼 瀏覽:745
單片機的原理概述 瀏覽:512
火控pdf 瀏覽:269
如何復制雲伺服器centos環境 瀏覽:984
債權pdf 瀏覽:303
紅色番字的app怎麼下載 瀏覽:876
雲伺服器流程教課 瀏覽:704
中國農業銀行app怎麼沒有網 瀏覽:999
幾率表演算法 瀏覽:904
程序員理工科 瀏覽:708
企業郵箱登錄收件伺服器地址 瀏覽:560
計算機思維與演算法設計的重要性 瀏覽:664