簡體   English   中英

“經典算法”的真實世界實現

[英]Real world implementations of “classical algorithms”

我想知道有多少人在現實世界中實現了計算機科學的“ 經典算法 ”,如Dijkstra算法數據結構 (例如二叉搜索樹),而不是學術項目?

當有大量的庫,框架和API為您提供相同的功能時,了解這些算法和數據結構對我們的日常工作有益嗎?

當有大量的庫,框架和API為您提供相同的功能時,了解這些算法和數據結構對我們的日常工作有益嗎?

該庫不知道您的問題域是什么,並且無法選擇正確的算法來完成這項工作。 這就是我認為了解它們很重要的原因:然后你可以正確選擇算法來解決你的問題。

理解您的工具是否有益處,而不僅僅是知道它們存在?

是的,當然有。 舉一個簡單的例子,你不認為知道List(或你的語言的等效動態數組實現)和LinkedList(或你的語言等價物)有什么區別是有好處的嗎? 知道一個人具有恆定的隨機訪問時間,而另一個是線性的,這一點非常重要。 如果在序列的中間插入一個值,則需要N個副本,而另一個可以在恆定時間內完成。

您是否認為理解相同的排序算法並不總是最優的? 例如,對於幾乎排序的數據,快速排序很糟糕? 如果你不明白引擎蓋下發生了什么,天真地只是調用Sort()並希望最好的可能會變得非常昂貴。

當然,你可能不需要很多算法,但即便如此,只要了解它們的工作方式,就可以讓自己更容易找到有效的算法來解決其他無關的問題。

了解或能夠理解這些算法非常重要,這些都是您交易的工具。 這並不意味着你必須能夠在一小時內從內存中實現A *。 但是你應該能夠弄清楚使用紅黑樹而不是普通的不平衡樹的優點是什么,所以可以決定你是否需要它。 需要能夠判斷算法的適用性以解決您的問題。

這可能聽起來像學校一樣,但這些“經典算法”並不是為了給大學生提供考試問題而發明的,它們是為解決問題或改進現有解決方案而發明的,就像數組,鏈表或堆棧是構建塊一樣。寫一個程序,其中一些。 就像在數學中你從加法和減法轉向整合和區分一樣,這些都是先進的技術,可以幫助你解決那里的問題。

它們可能不會直接適用於您的問題或工作情況,但從長遠來看,了解它們將有助於您作為專業軟件工程師。

為了回答你的問題,我最近為游戲實施了A *。

好吧,有人必須編寫庫。 在地圖軟件公司工作時,我實現了Dijkstra,以及二叉搜索樹,b樹,n-ary樹,bk-trees和隱藏的馬爾可夫模型。

此外,如果您想要的只是一個“眾所周知”的算法,並且您還希望自由專業化並優化它,如果它對性能至關重要,包括整個庫似乎是一個糟糕的選擇。

在我之前的EDA公司工作場所,我們實現了Prim和Dijsktra算法的版本,不相交的集合數據結構,A *搜索等等。 所有這些都具有現實世界的意義。 我認為這取決於問題域 - 一些域更加算法密集,而另一些域則更少。

話雖如此,有一條很好的路要走 - 我認為重新實現STLJava Generics沒有商業理由。 在許多情況下,標准庫比“發明輪子”更好。 您在核心應用程序附近的越多,實現教科書算法或數據結構的可能性就越大。

我們使用來自Knuth SemiNumeric的p隨機數生成器的本地實現作為一些統計處理的輔助

如果您從未使用性能關鍵代碼,請認為自己很幸運。 但是,我認為這種情況不切實際。 性能問題可能發生在任 然后有必要知道如何解決這個問題。 顯然,僅僅知道一些算法名稱在這里是不夠的 - 除非你想要全部實現它們並一個接一個地嘗試它們。

不,了解(至少某些)不同算法的內部運作對於衡量他們的優勢和劣勢以及分析他們如何處理您的情況非常重要。

顯然,如果有一個圖書館已經完全實現了你所需要的東西,那你就非常幸運。 但是讓我們面對它,即使有這樣的庫,使用它通常也不是完全直接的(至少,接口和數據表示通常必須進行調整)所以知道期待什么仍然是好的。

A *為pac人克隆。 我花了好幾個星期才真正開始,但直到今天我認為這是一件美麗的事情。

我不得不從數值分析中實現一些經典算法。 編寫自己的文件比連接現有庫更容易。 此外,我不得不在經典算法上編寫變體,因為教科書案例不適合我的應用程序。

對於經典數據結構,我幾乎總是使用標准庫,例如STL for C ++。 最近有一次,當我認為STL沒有我需要的結構(一堆)時,我自己滾動,只是讓某人幾乎立即指出我不需要那樣做。

我在實際工作中使用的經典算法:

  • 拓撲排序

  • 一棵紅黑樹(雖然我承認我只需要為該應用程序實現插入,它只用於原型)。 這習慣於在Python中實現'ordered dict'類型結構。

  • 優先級隊列

  • 各種狀態的機器

  • 可能還有一兩個我不記得了。

至於問題的第二部分:

理解算法如何工作,它們的復雜性和語義得到了相當規律的使用。 它們還告知系統的設計。 有時,人們必須做一些涉及解析或協議處理的事情,或者一些稍微聰明的計算。 掌握算法的作用,它們如何工作,它們有多昂貴以及在圖書館代碼中找到它們的位置的工作知識對於知道如何避免重新發明輪子很有幫助。

經典算法通常與迷人的東西相關聯,如游戲,網絡搜索或科學計算。 但是,我不得不將一些經典算法用於純粹的企業應用程序。

我正在構建元數據遷移工具,我不得不使用拓撲排序來進行依賴項解析,使用各種形式的圖遍歷來查詢元數據,以及修改Tarjan的union-find數據結構變體以將類似森林的結構化元數據划分為樹。

這是一次非常令人滿意的體驗。 大多數算法之前都已實現過,但是它們的實現缺少我的任務所需要的東西。 這就是理解他們內部的重要性的原因。

我使用Levenshtein距離算法幫助實現'你的意思是[建議的單詞] ?' 在我們的網站搜索功能。

當與我們的'標記'系統結合使用時,它可以很好地工作,這允許我們將額外的單詞(標題/描述/等之外的單詞)與數據庫中的項相關聯。 \\

它無論如何都不是完美的,但如果我自己也不這樣說的話,它會比大多數公司網站搜索更好;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM