『壹』 平衡二叉樹涉及了哪些數據結構和演算法,關鍵技術是什麼,主要功能和模塊有哪些急!!!!!!
主要就是一些二叉搜索樹,用於搜索的唄。。。像紅黑樹,AVL樹等。功能就是構建,插入刪除,查找咯,他主要就是速度快,時間復雜度是log(n)
『貳』 嵌入式系統軟體可靠性設計資料及嵌入式軟體可靠性設計培訓
「中國電子標准協會WAYS」有嵌入式軟體可靠性設計的企公開課程和企業內訓安排,詳情可以網路搜一下他們網站了解一下。以下為他們協會的通用大綱!
嵌入式軟體既是電子系統的核心,也是硬體系統的有效補充,需要具備防錯、判錯、糾錯、容錯的功能,具備了這些功能,就能保證系統可靠性要求在軟體分系統設計中的實現。但是軟體可靠性又不同於硬體電路,它不會隨時間的推移而降低,並且其可靠性保障全部在設計過程中實現。因此軟體工程的工作也是軟體可靠性所要關注的內容。
為此,中國電子標准協會決定組織召開《嵌入式軟體可靠性設計》講座,本講座主要從嵌入式軟體的系統設計、需求分析、介面、模塊、變數控制、軟體測試、安全性分析、硬體匹配設計等設計規范進行總結和分析,深層次探討嵌入式軟體的可靠性設計技巧。現具體事宜通知如下:
課程提綱:
1.概述和定義
2.計算機系統設計准則:
2.1、一般要求;
2.2、硬體與軟體功能的分配原則;
2.3、硬體與軟體可靠性指標的分配原則;
2.4、安全關鍵功能的人工確認;
2.5、安全性內核;
2.6、自動記錄系統故障;
2.7、禁止迴避檢測出的不安全狀態;
2.8、保密性設計;
2.9、容錯設計
3.硬體設計:
3.1、硬體選用;
3.2、匯流排檢測;
3.3、加電檢測;
3.4、電源失效的安全措施;
3.5、主控計算機失效的安全措施;
3.6、反饋迴路感測器失效的防護措施
3.7、電磁干擾的防護措施;
3.8、維修互鎖措施
4.軟體需求分析
5.軟體危險分析
6.安全關鍵功能設計
7.冗餘設計准則:
7.1、指令冗餘設計;
7.2、軟體陷阱與軟體攔截技術;
7.3、軟體冗餘
8.介面設計准則:
8.1、硬體介面要求;
8.2、硬體介面的軟體設計;
8.3、人機界面設計;
8.4、報警設計;
8.5、軟體介面設計
9.軟體健壯性設計准則:
9.1、電源失效防護;
9.2、加電檢測;
9.3、電磁干擾;
9.4、系統不穩定;
9.5、介面故障
9.6、干擾信號
9.7、錯誤操作;
9.8、監控定時器的設計
9.9、異常保護設計
10. 簡化設計准則:
10.1、單入和單出;
10.2、模塊的獨立性;
10.3、模塊的扇入扇出;
10.4、模塊耦合方式;
10.5、模塊內聚順方式;
10.6、其他特殊考慮
11.餘量設計:
11.1、資源分配及餘量要求
11.2、時序安排的餘量要求
12. 數據要求:
12.1、數據需求;
12.2、屬性控制;
12.3、數值運算范圍控制;
12.4、合理性檢查
13. 防錯程序設計准則:
13.1、參數化;
13.2、公用數據和公共變數;
13.3、標志;
13.4、文件;
13.5、非授權存取的限制
13.6、無意指令跳轉的處理;
13.7、程序檢測點的設置
13.8、定址模式的選用;
13.9、數據區隔離;
13.10、安全關鍵信息的要求;
13.11、信息存儲要求;
13.12、演算法選擇要求
14. 編程要求:
14.1、語言要求;
14.2、匯編語言編程限制
14.3、高級語言的編程限制;
14.4、圈復雜度指數(McCabe)
14.5、軟體單元的規模;
14.6、命名要求;
14.7、程序格式要求;
14.8、程序注釋要求與方法;
14.8.1、注釋的一般要求
14.8.2、模塊頭注釋要求;
14.8.3、模塊內注釋要求;
14.8.4、安全關鍵內容注釋要求;
14.9程序設計風格;
14.9.1、通用類;
14.9.2、結構類;
14.9.3、說明類;
14.9.4、輸人輸出類;
14.9.5、語言類
15. 多餘物的處理:
15.1、文檔中未記載特徵的清除;
15.2、程序多餘物的清除;
15.3、未使用內存的處理;
15.4、覆蓋的處理
16. 版式
17. 注釋
18. 命名
19. 可讀性
20. 變數、結構
21.函數、過程
22. 可測性與軟體測試:
22.1、需求遺漏或不明確
22.2、配置保存的生效
22.3、預設配置的影響
22.4、報警和清除
22.5、菜單選項測試
22.6、預設配置測試
22.7、系統測試注意事項
23. 程序效率
24. 質量保證
25. 代碼編輯、編譯、審查
26. 代碼測試、維護
27. 宏
『叄』 情報檢索系統的系統設計
情報檢索系統設計是開發情報檢索系統的重要階段。根據系統開發的目的和要求,全面地研究和分析各種有關因素,規劃系統的組成、功能和開發的方法、步驟,合理地組織人力和物力,以保證按時建成人機密切配合的自動化情報檢索系統。現代化情報檢索系統因資料庫內容和服務對象不同而各異,但是,不論進行何種情報檢索系統的設計,都要考慮數據的搜集、選擇評價、加工、輸入、建庫、檢索和輸出工作環節的任務和要求。情報檢索系統的設計,與其他信息系統的設計一樣,要經過以下主要步驟:
①分析用戶要求用戶需求調查、現狀調查和分析,確定系統功能並寫出系統設計任務書。
②系統設計確定系統的結構 (包括數據結構和模塊結構) 、功能要求及關鍵性演算法。設計的結果應產生一份系統設計說明書。
③程序設計 按數據結構和功能模塊等明確任務,分工進行程序設計。
④調試和檢測用一組精心設計的數據來揭露系統的缺陷和錯誤,以保證忠實地實現系統任務書中所規定的各項要求,並有相當的可靠性和穩定性,而不致於因這樣或那樣的失誤造成整個系統失效。
⑤驗收、運行管理對已調試的系統進行測試和鑒定。驗收合格後便可投入運行管理。運行管理即對系統運行進行不斷的檢查、控制和維護。它包括建立和改善環境,保證系統正常運行;記錄系統運行情況,這是科學管理的基礎;有計劃有組織地對系統進行必要的修改,以保證能正確地完成用戶所要求的任務,使系統適應內外環境的各種變化;定期或不定期地對系統的運行史進行回顧和評價。工作由系統主管人員負責進行,組織專家進行評議,作出科學的評價,提出改進和發展方向。
『肆』 如何選擇網上閱卷系統
選擇網上閱卷系統的明智之舉
歷經十年發展,計算機網上閱卷系統在高考、中考、教育局統考及學校日常考試的應用日益普及,人們對它的概念或說法已不陌生。但面對紛繁復雜、真偽難辨的網上閱卷市場,部分用戶或經銷商由於缺乏對產品及市場的充分了解而感到迷茫,都在思考什麼樣的產品才是用戶最需要的,如何才能做到正確選擇等問題。
為使廣大用戶和經銷商正確選擇產品,我們將對網上閱卷系統的本質、要求及選擇要素作簡要介紹,期望對有意購買或經銷網上閱卷系統的人們有所幫助。
一、何謂網上閱卷系統?
網上閱卷系統是指以計算機網路技術及電子掃描與識別技術為依託,實現客觀題自動閱卷,主觀題網上評卷及成績數據處理的計算機軟體系統。
二、網上閱卷系統的功能及性能要求
總體上說,網上閱卷系統應具有如下功能:
1、支持普通紙單面、雙面設計及製作答卷;
2、答卷掃描與識別必須方便、快速與准確;
3、網上評卷過程及結果必須符合教學需要;
4、統計分析滿足教育測量理論與實際要求。
三、網上閱卷系統的核心技術及關鍵功能
1、核心技術 ---- 掃描識別技術
掃描識別技術之所以被稱為網上閱卷系統的核心技術,一方面是因為它從根本上決定了系統功能及性能的優劣;另一方面是因為它具有較高的技術門檻,非一般廠家或人員所能輕易攻克。
目前,應用於網上閱卷系統的掃描識別技術分為固定定位識別技術、相對定位識別技術與「無需定位,模糊識別技術」三種。前兩種相對容易,可供借鑒的較多,但以此技術設計的產品存在較多的弊端;後者難度較高,需要深厚的技術功底才能掌握,但以其設計的產品,相對於定位識別技術產品而言具有絕對的優勢。兩者的主要差異見下表:
比較項目名稱 無需定位、模糊識別技術 固定定位或相對定位技術
答卷設計與製作要求 常用軟體+普通紙+速印機即可 相同條件下的操作復雜性較高
識別效率及其准確性 識別效率高,准確率高達100% 識別效率低,准確性難以確定
系統查錯與糾錯能力 出錯率低,查錯與糾錯能力強 錯誤率高,差錯與糾錯能力弱
系統的環境適應能力 圖像小,可適應任何網路環境 圖像大,不能實現互聯網閱卷
※以上僅為便於理解所做的比較,任何廠家或人員請勿對號入座。
2、關鍵功能 ---- 分析評價功能
對教育局及學校而言,應用網上閱卷系統的主要目的不外乎兩個方面:一是為教學診斷和針對性教學提供科學依據;二是為減輕教師負擔,節省考試成本提供現代化手段。相對而言,前者更受人們重視,因為離開了教學質量一切都將變得毫無意義。但要實現科學的教學診斷和有針對性的教學,達到提高教學質量的目的,對考試閱卷結果的科學處理與專業分析尤為重要,因此,統計分析與評價就成為網上閱卷系統的關鍵功能。
衡量網上閱卷系統的分析與評價功能優劣,可結合如下因素考慮:
(1)統計指標與分析報表是否符合《教育測量學》、《教育統計學》與《教育評價學》的原理?
(2)系統提供的統計指標及演算法是否符合教學實際需要,其所生成的分析報表是否滿足教學要求?
(3) 統計指標及報表的選擇是否靈活,擴展性是否良好,操作是否簡單、方便等。
四、選擇網上閱卷系統必須考查的要素
鑒於網上閱卷系統市場日趨復雜,各種不實宣傳甚至虛假廣告廣泛流傳,為避免因錯誤選擇導致的重大損失,我們認為,無論是最終用戶,還是從事產品銷售的經銷商,正確選擇都比正確使用或銷售更重要,因為錯誤選擇的結果輕則帶來使用操作上的麻煩,重則關繫到項目成敗,甚至必須為此承擔不必要的責任。因此,掌握網上閱卷系統選擇的要領,無論對最終用戶還是經銷商都至關重要。
以下是選擇網上閱卷系統前必須注重做好的產品考查原則。
1、應用情況考查
網上閱卷系統是純軟體產品,只有經過大量的應用和完善才能成熟穩定。因此,考查產品的使用情況,在某種程度上是確保所選產品質量最為可靠的方法。在實際的考查中,建議用戶或經銷商著重考查所選產品實際案例的多少,使用頻率的高低,操作使用的難易和用戶整體的評價等內容,為最終決策提供可靠的依據。
2、系統功能考查
網上閱卷系統的構成從說法上雖然大同小異,但不同產品之間的功能存在明顯的差別。以下是考查教育局及學校級應用網上閱卷系統時必須重點關注的功能:
(1)考查答卷的設計是否簡單,答卷的製作是否方便?
這是衡量系統操作方便性及成本高低的功能指標。答案如果是否定的,那麼其使用一定麻煩,成本也必定增高。
(2)考查填塗要求,判別每張答卷是否需要填塗考號?
這是衡量系統科學性及差錯規避能力的功能指標。如果答案是肯定的,那麼這樣的系統一定存在人為錯誤增多,浪費答卷紙張及增加學生負擔等問題。
(3)考查答卷圖像格式,正確分辨答卷圖像容量大小?
這是衡量系統對設備配置與網路帶寬要求的功能指標。如果A3答卷的圖像容量大於300K,那麼這樣的系統只能在區域網或專網上運行,無法滿足通過互聯網遠程閱卷的需要。換句話說,「回家改卷」或跨地區聯考閱卷將成為空話。
(4)考查統計指標及分析報表是否符合教學管理需要?
這是衡量系統的統計分析結果是否科學及能否滿足教學需要的功能指標。如果答案是否定的,那麼這樣的系統對教學診斷、針對性教學和提高教學質量將難有幫助。
※以上只是考查網上閱卷系統功能的部分內容,完整的考查項目可向專業機構咨詢或根據用戶實際需要制訂。
3、產品技術考查
網上閱卷系統功能的優劣、性能的好壞與開發商採用的開發技術及利用技術實現目標的程度密切相關。經過十多年的發展,網上評卷部分的技術相對成熟,差距不斷縮小,可不作為重點的考查內容。但基於普通紙答卷應用的掃描識別技術,在某種程度上可以說是衡量網上閱卷系統優劣的關鍵所在。因為它不但涉及到答卷製作的難易,而且還事關掃描識別的速度及其准確性,因而它是網上閱卷系統的核心技術。
為便於把握技術考查重點,現就考查內容及其理由闡述如下。
(1)考查系統是否支持無需定位點、定位線或同步頭的答卷掃描識別?
這是衡量系統容錯能力的功能指標。因為如果答案是否定的,那麼答卷的設計、印刷、掃描等過程產生的任何偏移都將導致識別錯誤的發生,並由此引發容錯能力的下降及查錯、糾錯的工作量的增加。
(2)考查系統的掃描與識別是否同步,速度是否達到了掃描儀標稱值?
這是衡量系統效率高低的功能指標。如果答案是否定的,意味著掃描與識別工作必須分步進行,由此除增加掃描識別工作量外,還將大幅增加查錯、糾錯的時間和難度,降低工作效率。
(3)考查系統在現有功能的輔助下,掃描識別准確率是否能達到100%?
這是衡量系統識別准確性的功能指標。如果答案是否定的,或需要過多的人工干預才能實現,那麼該系統的可靠性將大大降低,甚至還可能由於錯誤率高而影響到系統的應用,降低系統的可用性。
(4)考查系統對可疑的填塗是否具有自動查錯、提示及集中糾錯功能?
這是衡量系統效率高低的另一重要功能指標。如果答案是否定的,意味著查錯、糾錯都需要人工逐一進行,因此不但操作麻煩,效率低下,而且結果的准確性也將受到質疑。
除上述考查內容外,一個技術過硬的網上閱卷系統還應具有較強的兼容能力,可以滿足不同系統、不同答卷的兼容性要求,並能在各種網路環境下運行。
4、實際測試檢驗
由於軟體產品的特殊性和復雜性,如果通過上述方法尚不能判定產品是否符合要求,最為穩妥的方法就是進行試用測試。在測試產品時,如下方法可供用戶參考:
(1)獨家產品測試
如果意向購買產品非常明確,用戶可在實際考試中要求供應商提供產品試用,並從答卷設計到統計分析進行全程測試,過程中應准確記錄各環節所需時間及出現的問題。如果用戶條件許可的,最好能派人實際操作,避免因廠家或供應商操作隱瞞系統缺陷。
(2)多家產品測試
如果意向購買產品不明確或有多家可以候選,用戶最好按照獨家產品測試的方法,在同一次考試中要求各開發商提供產品進行分科測試,並准確記錄各產品在每一測試環節所需要時間及出現的問題,形成對比測試表,以此作為最終選擇的依據。與獨家測試相同,在條件許可的情況下,用戶最好派人對不同系統進行實際操作,避免因開發商或供應商操作隱瞞系統缺陷。
※注意:如果測試規模太小,建議增加具有針對性的技術及功能測試,因為規模太小的考試難以准確分辨出系統效率,也不利於發現問題。
五、經銷商應如何選擇網上閱卷系統?
除上述有關網上閱卷的概念、功能、技術及選擇要素必須掌握外,我們認為,經銷商在選擇網上閱卷系統時還應注重如下幾方面的因素:
1、 產品價值與產品價格的統一
追求利益最大化是企業的本質。一般而言,產品的價值應與產品的價格統一,任何偏離都將難以為繼,因此,經銷商在選擇產品時務必注意這一因素的作用,確保產品的利潤空間與企業持續發展的協調統一。
2、 項目投資與運營成本的比較
對用戶而言,任何項目建設都涉及投資與成本問題,項目效益分析毫不例外都會以此為主線。作為經銷商,無論經銷任何產品上述問題都也同樣存在,不同的只是其投資與成本是在銷售過程中產生,最終為項目利潤服務而已。因此,經銷商選擇經銷產品時,既要看前期及過程的投資,更要看後期的維護成本,不要被一些質次價低的產品所迷惑。因為劣質產品不但不可能高價,而且維護成本巨大,根本不可能為你帶來合理利潤,甚至還可能給企業帶來滅頂之災。
3、 經營投入與收益回報的分析
銷售收入去除直接成本、銷售費用、管理費用後才是項目的利潤,這是眾所周知的營銷常識。作為經銷商,如何以最少的投入,最低的費用去換取最大的效益不外乎也就在這幾個因素中謀劃。要實現利潤的最大化,經銷商除需要具備智慧的眼光外,還需要對經營投入與收益回報進行精確分析。因其中涉及產品、市場、銷售等復雜問題,故在此不展開論述。
以上介紹僅供有意購買或經銷網上閱卷系統者參考,不妥之處,歡迎指正。
『伍』 如何設計演算法
設計一個正確的演算法是一件困難的工作,因為它需要創新,從以太真空中發掘出一個解方案來解決問題。演算法設計比對現有的方案進行改良要難得多,因為演算法設計的可選擇空間太,過多的自由反而成了一種約束。 This book is designed to make you a better algorithm designer. The techniques presented in Part I of this book provide the basic ideas underlying all combinatorial algorithms. The problem catalog of Part II will help you with modeling your application and point you in the right direction of an algorithm or implementation. However, being a successful algorithm designer requires more than book knowledge; it requires a certain attitude, the right problem-solving approach. It is difficult to teach this mindset in a book; yet getting it is essential to become a successful designer. 本書的設計目標是讓你成為一個更好的演算法設計者。本書第一部分展示有關組合演算法的基本原理和基本思想;第二部分的問題清單幫助你為你的問題建模,並且為你指明實現正確演算法的方向。盡管如此,要成為一個成功的演算法設計者光有書本知識是不夠的,面對問題的態度(attitude)和選擇正確的方法更重要。書本容易傳授知識,很難傳授人的心態(mindset)和思考方式;而這種心態和思考卻是成為成功的演算法設計者的根本條件。 The key to algorithm design (or any other problem-solving task) is to proceed by asking yourself a sequence of questions to guide your thought process. What if we do this? What if we do that? Should you get stuck on the problem, the best thing to do is move onto the next question. In any group brainstorming session, the most useful person in the room is the one who keeps asking, ``Why can't we do it this way?'' not the person who later tells them why. Because eventually she will stumble on an approach that can't be shot down. 演算法設計(或其它問題解決任務)的關鍵是一系列持續的自我反問,這些反問引導我們思維的前進。「如果這樣做會怎樣?」,「如果那樣做又會怎樣?」……如果 你被一個問題掐住了,最好的辦法就是先擱一下,換一個問題換一個前進的方向試試。在每組頭腦風暴會議中,最有價值的人是不斷提出為什麼的人,不是爾後解說為什麼的人。因為我們常常被一些習以為常的東西所拌倒,掉進自己設置的陷阱。 kemin:如果問題解決是一種思考過程,那麼思考的形式(過程的嚴謹性、細致性和正確性)很重要,而思考的內容也不容忽視。因為引導我們思考前進的方式 除反問本身外,反問的內容也很重。就比如參加頭腦風暴的材料一樣。人大腦的思維功能是硬編碼的,人與人之間沒有思維規律——質的區別,只是思維的清晰度和 靈敏度——量的差別。人與人之間智力的差別更多體現在思維內容的量上,體現在對外部世界的事實掌握的廣度和深度上。 Towards this end, we provide below a sequence of questions to guide your search for the right algorithm for your problem. To use it effectively, you must not only ask the questions, but answer them. The key is working through the answers carefully, by writing them down in a log. The correct answer to, ``Can I do it this way?'' is never ``no,'' but ``no, because ....'' By clearly articulating(明確有力地表達) your reasoning as to why something doesn't work, you can check if it really holds up or whether you have just glossed(掩蓋) over a possibility that you didn't want to think hard enough about. You will be surprised how often the reason you can't find a convincing(使人信服的) explanation for something is because your conclusion is wrong. 在末尾我們提供一個反問問題的列表,你不但要反問自己這些問題,更重要是仔細回答這些問題,最好把答案寫下來。回答諸如問題「我可以使用這種方式嗎?」的 不是一個「不能」就完了,而是「不能,因為……」。通過仔細明確的回答「為什麼不能」時,你會發現到底是「真的不能「,還是只是你自己不願意去深入思考掩 蓋了」能「。如果你不曾訓練出嚴謹的思考方式,當你這樣做時你會驚訝的發現,為了說明某些東西但卻找不到一個令人信服的解釋的原因常常是因為你的結論本身 是錯的。 An important distinction to keep aware of ring any design process is the difference between strategy and tactics(戰略). Strategy represents the quest for the big picture, the framework around which we construct our path to the goal. Tactics are used to win the minor battles we must fight along the way. In problem solving, it is important to check repeatedly whether you are thinking on the right level. If you do not have a global strategy of how you are going to attack your problem, it is pointless to worry about the tactics. 在設計過程中特別重要區分策略和戰略的概念。策略是對全局的一個探索,一個構築通向目標路徑的指導框架。戰略則是用來解決通向大目標過程的較小的問題。如果你對關於如何對付所面臨的問題沒有一個全局的策略,那關心戰略是不得要領的,予事無補的。在解題領域,不斷修正思維的層次(thinking on the right level)是很重要戰略。(--萊布尼茲曾經將人的解題思考過程比喻成晃篩子,把腦袋裡面的東西都給抖落出來,然後正在搜索的注意力會抓住一切細微的、與問題有關的東西。事實上,要做到能夠令注意力抓住這些有關的東西,就必須時刻將問題放在注意力層面,否則即使關鍵的東西抖落出來了也可能沒注意到。) An example of a strategic question is, ``How best can I model my application as a graph algorithm problem?'' A tactical question might be, ``Should I use an adjacency鄰接 list or adjacency matrix data structure to represent my graph?'' Of course, such tactical decisions are critical to the ultimate quality of the solution, but they can be properly evaluated only in light of a successful strategy. 一個策略問題的例子是:「我如何才能更好地把我的問題建模成圖問題?」。而一個戰略問題可能是這樣:「我是用鄰接列表還是鄰接矩陣來實現我的圖結構?」。當然,這種戰略選擇是對解決方案的最終質量起著重要作用;不過戰略價值的體現還是基於正確的策略的選擇。 When faced with a design problem, too many people freeze up in their thinking. After reading or hearing the problem, they sit down and realize that they don't know what to do next. They stare(凝視) into space, then panic(驚惶), and finally end up settling(沉澱; 決定) for the first thing that comes to mind. Avoid this fate(天數; 運氣; 命運 ). Follow the sequence of questions provided below and in most of the catalog problem sections. We'll tell you what to do next! 初學者在面對問題時常常表現出思維凝滯、手足無措和盲目解題。參考以下的反問問題列表和本書的問題清單,我們告訴你應該怎麼做。 Obviously, the more experience you have with algorithm design techniques such as dynamic programming, graph algorithms, intractability, and data structures, the more successful you will be at working through the list of questions. Part I of this book has been designed to strengthen this technical background. However, it pays to work through these questions regardless of how strong your technical skills are. The earliest and most important questions on the list focus on obtaining a detailed understanding of the problem and do not require specific expertise. 當然本反問問題列表對讀者有背景要求,要求讀者對演算法設計技術(動態規劃、圖演算法、難解性和數據結構)的熟悉程度。本書第一部分的目標就是對這些技術背景進行強化。不過,不管你的技術背景怎樣,通讀這些問題對你解題還是很有裨益的。
『陸』 功能設計方法的步驟
一、業務分析——要做什麼(業務流程圖)
幾乎每一款產品都會對應一個或多個業務流程,它是對業務事件和不同角色間通過信息流動和交互方式的一種表達,對應的交付物就是業務流程圖。
例如電商業務有訂單生產流程圖、有貨物進倉出庫流程圖、也有資金流程圖;外賣業務有接單業務流程圖、派單業務流程圖、訂單流轉流程圖等。
做產品的第一步就是把業務分析清楚,弄明白要做什麼,有哪些角色參與,業務交互節點是什麼,信息流、資金流、物流等是如何流轉的。
搞清了這些後,就可以繪制不同業務模塊的流程圖,對整個全局就比較清楚了。另外,我們所說的產品定位、產品路線圖也包含在這個環節內。
二、產品分析——解決什麼用戶問題(User Story)
在完成業務分析並設計好業務流程之後,就可以進入產品分析的環節了,這部分的主要目的就是要明確下來是要解決什麼用戶問題。
具體就包含了目標用戶、人群畫像、需求定義、用戶體驗地圖設計等。主要是從用戶和產品的角度,通過一些工具把產品要解決的問題具象化表達出來。
例如具體的用戶畫像構建、需求分類(緊急重要、是否關鍵路徑)、結合業務流程繪制用戶情感體驗地圖等。
然後,在這一步需要定義 MVP(最小可行性產品)以及產品的關鍵路徑(最小關鍵業務流程),並形成需求清單以及功能清單,排列好優先順序。
除此之外,我們常說的競品分析和用戶調研也是在這一步完成,並交付相應的調研分析報告。
這一步的核心就是圍繞「解決用戶什麼問題」來展開工作。
三、結構設計——構建產品骨架(信息架構、功能結構)
到第三步就比較具體了,就是我們常說的設計信息架構和功能結構,交付物就是樹狀結構的思維導圖,這個大家應該都見過也做過。
但需要區別的是,信息架構和功能結構不是一回事,前者是描述產品的信息骨架。例如一個網站的結構包括哪幾個部分,每部分具體包括哪些欄位信息。這一步最好有技術同學介入。
後者是從使用操作的角度來描述具體的功能結構,例如賬戶體系包括了注冊和登錄功能。
為什麼需要這兩張圖呢?
信息架構有助於我們全局了解產品的信息脈絡,尤其是對於一些復雜項目,比較利於進行模塊化整合和分類。
而功能結構也能很清晰的告訴我們現在產品有哪些具體的大功能和子功能,有些能抽取出來合並同類項的就可以在技術層面做模塊化整合。
到目前為止,我們還不會進入具體的原型繪制階段。
雖然以上三步很重要,但很多人、很多團隊其實都忽視了,出現的問題就是產品混亂,新人來了以後沒有產品全景圖,也不知從何下手。
涉及到歷史功能調整時,也不清楚前期的架構和模塊劃分是如何設計的,牽一發動全身;就像一座大橋要拔掉一顆螺絲,但你不知道拔掉後整座橋會不會垮。
四、原型設計——產品怎麼用(交互設計、功能設計)
這一步大家都很熟悉了,使用工具畫原型、做交互設計,我也就不展開講了。
需要特別說明的是,在小公司,功能設計和交互設計大概率就是產品經理一人完成了,而在大公司可能會有專門的交互設計團隊。
例如我之前在京東時,具體的交互設計就是專門的 UED 團隊來完成,產品經理更側重需求定義和流程設計。
五、視覺設計——產品長什麼樣(設計師的工作)
視覺設計屬於設計師的工作范疇了,產品經理可介入性不大,我一向主張專業的事交給專業的人做。
這一步產品經理要做的是什麼呢,主要是向設計師描述產品使用場景以及用戶特徵,即產品在什麼情況下被什麼特徵的用戶來用。
對此,設計師可能會採取不同的布局設計和配色方案。
例如針對中老年的產品,在按鈕大小和字體顏色上,可能需要更醒目一些,如果設計師不理解大背景和產品用戶,可能會自己發揮,這樣就會造成產品可用性不高。
當然,這里說的可用性不高是指在目標用戶人群的可用性不高,但產品本身是可用的。
六、數據設計——驗證什麼(埋點、數據指標、監測策略)
我們可以說,大部分的產品都是基於先驗的假設進行設計的,也就是說實際情況如何我們提前很難知道,那就需要通過數據區驗證。
數據設計主要是基於第三步和第四部的成果進行具體驗證項定義,並在產品功能上設計相應的數據埋點,以及數據回收和統計機制。
例如在電商產品的商品詳情頁,用戶到底是點「直接購買」多,還是「加入購物車」多,那就在這兩個按鈕上進行數據埋點,然後統計一段時間內從這兩個渠道產生的訂單轉化率。
如今已經進入精細化運營的時代,對應的,產品也進入了精細化設計的階段,用科學的方式驗證需求,用數據去證明設計,已經成了產品經理必備的技能之一。
七、假設驗證——真相是什麼(「假設-數據-調整」閉環)
最後一步,就是基於數據結果進行復盤和調整,只有假設不行,只有數據也不行,最關鍵的是我們能從數據中獲得什麼洞察(insight)。
『柒』 java記事本關鍵技術和主要演算法是什麼記事本有打開、編輯、保存、另存為、查找等功能,用圖形界面實現的
我覺得應該是字串的操作 ,
模式匹配之類的
『捌』 C語言中什麼叫演算法,演算法在程序設計中的重要作用
一、什麼是演算法
演算法是一系列解決問題的清晰指令,也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。演算法常常含有重復的步驟和一些比較或邏輯判斷。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
演算法的時間復雜度是指演算法需要消耗的時間資源。一般來說,計算機演算法是問題規模n 的函數f(n),演算法執行的時間的增長率與f(n) 的增長率正相關,稱作漸進時間復雜度(Asymptotic Time Complexity)。時間復雜度用「O(數量級)」來表示,稱為「階」。常見的時間復雜度有: O(1)常數階;O(log2n)對數階;O(n)線性階;O(n2)平方階。
演算法的空間復雜度是指演算法需要消耗的空間資源。其計算和表示方法與時間復雜度類似,一般都用復雜度的漸近性來表示。同時間復雜度相比,空間復雜度的分析要簡單得多。
二、演算法設計的方法
1.遞推法
遞推法是利用問題本身所具有的一種遞推關系求問題解的一種方法。設要求問題規模為N的解,當N=1時,解或為已知,或能非常方便地得到解。能採用遞推法構造演算法的問題有重要的遞推性質,即當得到問題規模為i-1的解後,由問題的遞推性質,能從已求得的規模為1,2,…,i-1的一系列解,構造出問題規模為I的解。這樣,程序可從i=0或i=1出發,重復地,由已知至i-1規模的解,通過遞推,獲得規模為i的解,直至得到規模為N的解。
【問題】 階乘計算
問題描述:編寫程序,對給定的n(n≤100),計算並輸出k的階乘k!(k=1,2,…,n)的全部有效數字。
由於要求的整數可能大大超出一般整數的位數,程序用一維數組存儲長整數,存儲長整數數組的每個元素只存儲長整數的一位數字。如有m位成整數N用數組a[ ]存儲:
N=a[m]×10m-1+a[m-1]×10m-2+ … +a[2]×101+a[1]×100
並用a[0]存儲長整數N的位數m,即a[0]=m。按上述約定,數組的每個元素存儲k的階乘k!的一位數字,並從低位到高位依次存於數組的第二個元素、第三個元素……。例如,5!=120,在數組中的存儲形式為:
3 0 2 1 ……
首元素3表示長整數是一個3位數,接著是低位到高位依次是0、2、1,表示成整數120。
計算階乘k!可採用對已求得的階乘(k-1)!連續累加k-1次後求得。例如,已知4!=24,計算5!,可對原來的24累加4次24後得到120。細節見以下程序。
# include <stdio.h>
# include <malloc.h>
......
2.遞歸
遞歸是設計和描述演算法的一種有力的工具,由於它在復雜演算法的描述中被經常採用,為此在進一步介紹其他演算法設計方法之前先討論它。
能採用遞歸描述的演算法通常有這樣的特徵:為求解規模為N的問題,設法將它分解成規模較小的問題,然後從這些小問題的解方便地構造出大問題的解,並且這些規模較小的問題也能採用同樣的分解和綜合方法,分解成規模更小的問題,並從這些更小問題的解構造出規模較大問題的解。特別地,當規模N=1時,能直接得解。
【問題】 編寫計算斐波那契(Fibonacci)數列的第n項函數fib(n)。
斐波那契數列為:0、1、1、2、3、……,即:
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2) (當n>1時)。
寫成遞歸函數有:
int fib(int n)
{ if (n==0) return 0;
if (n==1) return 1;
if (n>1) return fib(n-1)+fib(n-2);
}
遞歸演算法的執行過程分遞推和回歸兩個階段。在遞推階段,把較復雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小於n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是說,為計算fib(n),必須先計算fib(n-1)和fib(n-2),而計算fib(n-1)和fib(n-2),又必須先計算fib(n-3)和fib(n-4)。依次類推,直至計算fib(1)和fib(0),分別能立即得到結果1和0。在遞推階段,必須要有終止遞歸的情況。例如在函數fib中,當n為1和0的情況。
在回歸階段,當獲得最簡單情況的解後,逐級返回,依次得到稍復雜問題的解,例如得到fib(1)和fib(0)後,返回得到fib(2)的結果,……,在得到了fib(n-1)和fib(n-2)的結果後,返回得到fib(n)的結果。
在編寫遞歸函數時要注意,函數中的局部變數和參數知識局限於當前調用層,當遞推進入「簡單問題」層時,原來層次上的參數和局部變數便被隱蔽起來。在一系列「簡單問題」層,它們各有自己的參數和局部變數。
由於遞歸引起一系列的函數調用,並且可能會有一系列的重復計算,遞歸演算法的執行效率相對較低。當某個遞歸演算法能較方便地轉換成遞推演算法時,通常按遞推演算法編寫程序。例如上例計算斐波那契數列的第n項的函數fib(n)應採用遞推演算法,即從斐波那契數列的前兩項出發,逐次由前兩項計算出下一項,直至計算出要求的第n項。
【問題】 組合問題
問題描述:找出從自然數1、2、……、n中任取r個數的所有組合。例如n=5,r=3的所有組合為: (1)5、4、3 (2)5、4、2 (3)5、4、1
(4)5、3、2 (5)5、3、1 (6)5、2、1
(7)4、3、2 (8)4、3、1 (9)4、2、1
(10)3、2、1
分析所列的10個組合,可以採用這樣的遞歸思想來考慮求組合函數的演算法。設函數為void comb(int m,int k)為找出從自然數1、2、……、m中任取k個數的所有組合。當組合的第一個數字選定時,其後的數字是從餘下的m-1個數中取k-1數的組合。這就將求m個數中取k個數的組合問題轉化成求m-1個數中取k-1個數的組合問題。設函數引入工作數組a[ ]存放求出的組合的數字,約定函數將確定的k個數字組合的第一個數字放在a[k]中,當一個組合求出後,才將a[ ]中的一個組合輸出。第一個數可以是m、m-1、……、k,函數將確定組合的第一個數字放入數組後,有兩種可能的選擇,因還未去頂組合的其餘元素,繼續遞歸去確定;或因已確定了組合的全部元素,輸出這個組合。細節見以下程序中的函數comb。
【程序】
# include <stdio.h>
# define MAXN 100
int a[MAXN];
void comb(int m,int k)
{ int i,j;
for (i=m;i>=k;i--)
{ a[k]=i;
if (k>1)
comb(i-1,k-1);
else
{ for (j=a[0];j>0;j--)
printf(「%4d」,a[j]);
printf(「\n」);
}
}
}
void main()
{ a[0]=3;
comb(5,3);
}
3.回溯法
回溯法也稱為試探法,該方法首先暫時放棄關於問題規模大小的限制,並將問題的候選解按某種順序逐一枚舉和檢驗。當發現當前候選解不可能是解時,就選擇下一個候選解;倘若當前候選解除了還不滿足問題規模要求外,滿足所有其他要求時,繼續擴大當前候選解的規模,並繼續試探。如果當前候選解滿足包括問題規模在內的所有要求時,該候選解就是問題的一個解。在回溯法中,放棄當前候選解,尋找下一個候選解的過程稱為回溯。擴大當前候選解的規模,以繼續試探的過程稱為向前試探。
【問題】 組合問題
問題描述:找出從自然數1,2,…,n中任取r個數的所有組合。
採用回溯法找問題的解,將找到的組合以從小到大順序存於a[0],a[1],…,a[r-1]中,組合的元素滿足以下性質:
(1) a[i+1]>a,後一個數字比前一個大;
(2) a-i<=n-r+1。
按回溯法的思想,找解過程可以敘述如下:
首先放棄組合數個數為r的條件,候選組合從只有一個數字1開始。因該候選解滿足除問題規模之外的全部條件,擴大其規模,並使其滿足上述條件(1),候選組合改為1,2。繼續這一過程,得到候選組合1,2,3。該候選解滿足包括問題規模在內的全部條件,因而是一個解。在該解的基礎上,選下一個候選解,因a[2]上的3調整為4,以及以後調整為5都滿足問題的全部要求,得到解1,2,4和1,2,5。由於對5不能再作調整,就要從a[2]回溯到a[1],這時,a[1]=2,可以調整為3,並向前試探,得到解1,3,4。重復上述向前試探和向後回溯,直至要從a[0]再回溯時,說明已經找完問題的全部解。按上述思想寫成程序如下:
【程序】
# define MAXN 100
int a[MAXN];
void comb(int m,int r)
{ int i,j;
i=0;
a=1;
do {
if (a-i<=m-r+1
{ if (i==r-1)
{ for (j=0;j<r;j++)
printf(「%4d」,a[j]);
printf(「\n」);
}
a++;
continue;
}
else
{ if (i==0)
return;
a[--i]++;
}
} while (1)
}
main()
{ comb(5,3);
}
4.貪婪法
貪婪法是一種不追求最優解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因為它省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪婪法常以當前情況為基礎作最優選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。
例如平時購物找錢時,為使找回的零錢的硬幣數最少,不考慮找零錢的所有各種發表方案,而是從最大面值的幣種開始,按遞減的順序考慮各幣種,先盡量用大面值的幣種,當不足大面值幣種的金額時才去考慮下一種較小面值的幣種。這就是在使用貪婪法。這種方法在這里總是最優,是因為銀行對其發行的硬幣種類和硬幣面值的巧妙安排。如只有面值分別為1、5和11單位的硬幣,而希望找回總額為15單位的硬幣。按貪婪演算法,應找1個11單位面值的硬幣和4個1單位面值的硬幣,共找回5個硬幣。但最優的解應是3個5單位面值的硬幣。
【問題】 裝箱問題
問題描述:裝箱問題可簡述如下:設有編號為0、1、…、n-1的n種物品,體積分別為v0、v1、…、vn-1。將這n種物品裝到容量都為V的若干箱子里。約定這n種物品的體積均不超過V,即對於0≤i<n,有0<vi≤V。不同的裝箱方案所需要的箱子數目可能不同。裝箱問題要求使裝盡這n種物品的箱子數要少。
若考察將n種物品的集合分劃成n個或小於n個物品的所有子集,最優解就可以找到。但所有可能劃分的總數太大。對適當大的n,找出所有可能的劃分要花費的時間是無法承受的。為此,對裝箱問題採用非常簡單的近似演算法,即貪婪法。該演算法依次將物品放到它第一個能放進去的箱子中,該演算法雖不能保證找到最優解,但還是能找到非常好的解。不失一般性,設n件物品的體積是按從大到小排好序的,即有v0≥v1≥…≥vn-1。如不滿足上述要求,只要先對這n件物品按它們的體積從大到小排序,然後按排序結果對物品重新編號即可。裝箱演算法簡單描述如下:
{ 輸入箱子的容積;
輸入物品種數n;
按體積從大到小順序,輸入各物品的體積;
預置已用箱子鏈為空;
預置已用箱子計數器box_count為0;
for (i=0;i<n;i++)
{ 從已用的第一隻箱子開始順序尋找能放入物品i 的箱子j;
if (已用箱子都不能再放物品i)
{ 另用一個箱子,並將物品i放入該箱子;
box_count++;
}
else
將物品i放入箱子j;
}
}
上述演算法能求出需要的箱子數box_count,並能求出各箱子所裝物品。下面的例子說明該演算法不一定能找到最優解,設有6種物品,它們的體積分別為:60、45、35、20、20和20單位體積,箱子的容積為100個單位體積。按上述演算法計算,需三隻箱子,各箱子所裝物品分別為:第一隻箱子裝物品1、3;第二隻箱子裝物品2、4、5;第三隻箱子裝物品6。而最優解為兩只箱子,分別裝物品1、4、5和2、3、6。
若每隻箱子所裝物品用鏈表來表示,鏈表首結點指針存於一個結構中,結構記錄尚剩餘的空間量和該箱子所裝物品鏈表的首指針。另將全部箱子的信息也構成鏈表。以下是按以上演算法編寫的程序。
}
5.分治法
任何一個可以用計算機求解的問題所需的計算時間都與其規模N有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。例如,對於n個元素的排序問題,當n=1時,不需任何計算;n=2時,只要作一次比較即可排好序;n=3時只要作3次比較即可,…。而當n較大時,問題就不那麼容易處理了。要想直接解決一個規模較大的問題,有時是相當困難的。
分治法的設計思想是,將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。
如果原問題可分割成k個子問題(1<k≤n),且這些子問題都可解,並可利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。由分治法產生的子問題往往是原問題的較小模式,這就為使用遞歸技術提供了方便。在這種情況下,反復應用分治手段,可以使子問題與原問題類型一致而其規模卻不斷縮小,最終使子問題縮小到很容易直接求出其解。這自然導致遞歸過程的產生。分治與遞歸像一對孿生兄弟,經常同時應用在演算法設計之中,並由此產生許多高效演算法。
分治法所能解決的問題一般具有以下幾個特徵:
(1)該問題的規模縮小到一定的程度就可以容易地解決;
(2)該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質;
(3)利用該問題分解出的子問題的解可以合並為該問題的解;
(4)該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。
上述的第一條特徵是絕大多數問題都可以滿足的,因為問題的計算復雜性一般是隨著問題規模的增加而增加;第二條特徵是應用分治法的前提,它也是大多數問題可以滿足的,此特徵反映了遞歸思想的應用;第三條特徵是關鍵,能否利用分治法完全取決於問題是否具有第三條特徵,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮貪心法或動態規劃法。第四條特徵涉及到分治法的效率,如果各子問題是不獨立的,則分治法要做許多不必要的工作,重復地解公共的子問題,此時雖然可用分治法,但一般用動態規劃法較好。
分治法在每一層遞歸上都有三個步驟:
(1)分解:將原問題分解為若干個規模較小,相互獨立,與原問題形式相同的子問題;
(2)解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題;
(3)合並:將各個子問題的解合並為原問題的解。
6.動態規劃法
經常會遇到復雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解導出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。
為了節約重復求相同子問題的時間,引入一個數組,不管它們是否對最終解有用,把所有子問題的解存於該數組中,這就是動態規劃法所採用的基本方法。以下先用實例說明動態規劃方法的使用。
【問題】 求兩字元序列的最長公共字元子序列
問題描述:字元序列的子序列是指從給定字元序列中隨意地(不一定連續)去掉若干個字元(可能一個也不去掉)後所形成的字元序列。令給定的字元序列X=「x0,x1,…,xm-1」,序列Y=「y0,y1,…,yk-1」是X的子序列,存在X的一個嚴格遞增下標序列<i0,i1,…,ik-1>,使得對所有的j=0,1,…,k-1,有xij=yj。例如,X=「ABCBDAB」,Y=「BCDB」是X的一個子序列。
考慮最長公共子序列問題如何分解成子問題,設A=「a0,a1,…,am-1」,B=「b0,b1,…,bm-1」,並Z=「z0,z1,…,zk-1」為它們的最長公共子序列。不難證明有以下性質:
(1) 如果am-1=bn-1,則zk-1=am-1=bn-1,且「z0,z1,…,zk-2」是「a0,a1,…,am-2」和「b0,b1,…,bn-2」的一個最長公共子序列;
(2) 如果am-1!=bn-1,則若zk-1!=am-1,蘊涵「z0,z1,…,zk-1」是「a0,a1,…,am-2」和「b0,b1,…,bn-1」的一個最長公共子序列;
(3) 如果am-1!=bn-1,則若zk-1!=bn-1,蘊涵「z0,z1,…,zk-1」是「a0,a1,…,am-1」和「b0,b1,…,bn-2」的一個最長公共子序列。
這樣,在找A和B的公共子序列時,如有am-1=bn-1,則進一步解決一個子問題,找「a0,a1,…,am-2」和「b0,b1,…,bm-2」的一個最長公共子序列;如果am-1!=bn-1,則要解決兩個子問題,找出「a0,a1,…,am-2」和「b0,b1,…,bn-1」的一個最長公共子序列和找出「a0,a1,…,am-1」和「b0,b1,…,bn-2」的一個最長公共子序列,再取兩者中較長者作為A和B的最長公共子序列。
代碼如下:
# include <stdio.h>
# include <string.h>
# define N 100
char a[N],b[N],str[N];
int lcs_len(char *a, char *b, int c[ ][ N])
{ int m=strlen(a), n=strlen(b), i,j;
for (i=0;i<=m;i++) c[0]=0;
for (i=0;i<=n;i++) c[0]=0;
for (i=1;i<=m;i++)
for (j=1;j<=m;j++)
if (a[i-1]==b[j-1])
c[j]=c[i-1][j-1]+1;
else if (c[i-1][j]>=c[j-1])
c[j]=c[i-1][j];
else
c[j]=c[j-1];
return c[m][n];
}
char *buile_lcs(char s[ ],char *a, char *b)
{ int k, i=strlen(a), j=strlen(b);
k=lcs_len(a,b,c);
s[k]=』』;
while (k>0)
if (c[j]==c[i-1][j]) i--;
else if (c[j]==c[j-1]) j--;
else { s[--k]=a[i-1];
i--; j--;
}
return s;
}
void main()
{ printf (「Enter two string(<%d)!\n」,N);
scanf(「%s%s」,a,b);
printf(「LCS=%s\n」,build_lcs(str,a,b));
}
7.迭代法
迭代法是用於求方程或方程組近似根的一種常用的演算法設計方法。設方程為f(x)=0,用某種數學方法導出等價的形式x=g(x),然後按以下步驟執行:
(1) 選一個方程的近似根,賦給變數x0;
(2) 將x0的值保存於變數x1,然後計算g(x1),並將結果存於變數x0;
(3) 當x0與x1的差的絕對值還小於指定的精度要求時,重復步驟(2)的計算。
若方程有根,並且用上述方法計算出來的近似根序列收斂,則按上述方法求得的x0就認為是方程的根。上述演算法用C程序的形式表示為:
程序如下:
【演算法】迭代法求方程組的根
{ for (i=0;i<n;i++)
x=初始近似根;
do {
for (i=0;i<n;i++)
y = x;
for (i=0;i<n;i++)
x = gi(X);
for (delta=0.0,i=0;i<n;i++)
if (fabs(y-x)>delta) delta=fabs(y-x); } while (delta>Epsilon);
for (i=0;i<n;i++)
printf(「變數x[%d]的近似根是 %f」,I,x);
printf(「\n」);
} 具體使用迭代法求根時應注意以下兩種可能發生的情況:
(1)如果方程無解,演算法求出的近似根序列就不會收斂,迭代過程會變成死循環,因此在使用迭代演算法前應先考察方程是否有解,並在程序中對迭代的次數給予限制;
(2)方程雖然有解,但迭代公式選擇不當,或迭代的初始近似根選擇不合理,也會導致迭代失敗。
8.窮舉搜索法
窮舉搜索法是對可能是解的眾多候選解按某種順序進行逐一枚舉和檢驗,並從眾找出那些符合要求的候選解作為問題的解。
【問題】 將A、B、C、D、E、F這六個變數排成如圖所示的三角形,這六個變數分別取[1,6]上的整數,且均不相同。求使三角形三條邊上的變數之和相等的全部解。如圖就是一個解。
程序引入變數a、b、c、d、e、f,並讓它們分別順序取1至6的整數,在它們互不相同的條件下,測試由它們排成的如圖所示的三角形三條邊上的變數之和是否相等,如相等即為一種滿足要求的排列,把它們輸出。當這些變數取盡所有的組合後,程序就可得到全部可能的解。程序如下:
按窮舉法編寫的程序通常不能適應變化的情況。如問題改成有9個變數排成三角形,每條邊有4個變數的情況,程序的循環重數就要相應改變。