微軟、優步,老工程師告訴你哪些數據結構和算法最重要

2020-12-06 澎湃新聞

作者:Gergely Orosz

機器之心編譯

參與:小舟、杜偉

數據結構和基礎算法作為計算機科學的必學課程,近幾年卻關注度越來越少。但?一位在 Uber 等科技公司工作過的開發者分享了他的一手經驗,告訴你實際工作中會用到哪些數據結構和算法。

日常工作中,你經常使用算法和數據結構嗎?曾就職於 Uber 等科技公司的工程師 Gergely Orosz 提出了這樣一個問題。此外,他也注意到,越來越多的人覺得算法是無用的,並認為它們只是科技公司提出的一種強制性措施罷了。

本文作者 Gergely Orosz。

不僅如此,也有更多的人抱怨稱算法只是純粹的學術練習。在 Homebrew 作者 Max Howell 發表他的谷歌面試經歷之後,這樣的想法被進一步普及。

雖然 Gergely Orosz 自己也從來不需要使用二叉樹翻轉(binary tree inversion),但是他在 Skype、Microsoft、Skyscanner 以及 Uber 工作時,每天都會遇到使用數據結構和算法的情況。

此外,他有時也需要基於這些概念編寫代碼和做出決策。最後,Gergely Orosz 藉助這些知識來理解有些事物如何和為何構建,以及如何使用或修改它們。

由此可見,數據結構和算法並不是如人們所言用處不大。在本文中,Gergely Orosz 列舉了一系列現實世界的實例,包含生產中會用到的樹、圖等數據結構和各種算法。

值得肯定的,所有這些都出自他的第一手經驗,藉此希望表達他的觀點,即通用數據結構和算法知識並不只是「為了面試」,而是你在快速成長的創新型科技公司工作時,可能會經常遇到的東西。

Gergely Orosz 表示自己曾經用過非常小的算法子集,但幾乎包含了所有的數據結構。毫不奇怪,他不喜歡繁瑣的算法以及包含紅黑樹或 AVL 樹等不常見數據類型的不切實際的面試問題。

接下來具體來看作者列舉出來的實例,以第一人稱的口吻進行講述。

樹和樹遍歷:Skype、Uber 和 UI 框架

在微軟時,當我們構建 Xbox One 遊戲機(由微軟發布)的 Skype 軟體時,我們使用的是內置作業系統 Xbox OS,但缺少關鍵庫。我們當時正在該平臺上構建首個成熟的應用程式之一,所以需要一個能夠結合觸摸手勢和語音命令的導航解決方案。

我們在微軟 WinJS 庫上構建了一個通用的導航框架。為了做到這一點,我們需要維護一個類似於 DOM(文檔對象模型)的圖來跟蹤可操作的元素。為了找出這些元素,我們執行了 DOM 遍歷,基本上是現有 DOM 上的 B - 樹遍歷(B-tree traversal)。這便是 BFS(廣度優先搜索)或者 DFS(深度優先搜索)的經典示例。

在 Uber 時,團隊構建了很多實現節點、依賴關係以及它們之間連接可視化的工具。有一個例子就是 RIB 節點的可視化工具。該可視化工具需要維護一棵樹,將它可視化為可縮放矢量圖形(SVG),然後更新這棵樹,同時行動裝置上的 RIB 樹也發生變化。RIB 自己也會為狀態管理維護一個邏輯樹結構(logical tree structure),但這個樹結構與呈現對象不同,這就是他們設計背後的關鍵所在。

RIB 樹可視化:一個使用樹來表示數據並將其可視化的經典示例。

權重圖和最短路徑:Skyscanner

Skyscanner 會找到最佳機票。為此,它掃描了全球所有的航線,並將它們匯聚在一起。由於航空公司需要考慮中轉站的選擇,所以問題的本質更多地體現在爬蟲,而不是緩存。多城市規劃選項(multi-city planning option)成為了最短路徑問題。

多城市是 Skyscanner 花費大量時間來構建的功能之一。公平地說,產品方面的困難是最多的。最佳的多城市航線選擇就是使用 Dijkstra 或者 A * 這樣的最短路徑算法計算的。

航線用一張有向圖來表示,每條邊都有一個表示票價的權重,算出兩個城市之間票價最便宜的航線就是通過每條航線的改進版的 A * 搜索算法實現的。

但是使用 Skyscanner,實際算法就不那麼重要了。緩存、爬蟲和處理各種網站負載比解決問題本身要難得多。即便如此,最短路徑問題的變體還是在許多基於組合優化價格的旅行公司中使用。

排序:Skype

對於排序這種算法,我很少需要自己實現或深入使用。理解不同類型的排序方法是件很有趣的事,包括冒泡排序、插入排序、歸併排序、選擇排序以及最複雜的快速排序。但是,我還是很少需要自己手動實現這些算法,甚至從來沒有把排序函數作為庫的一部分來編寫。

在微軟 Skype 時,我練習了這方面的知識。另有一位工程師決定為聯繫人列表實現插入排序算法。2013 年,Skype 實現了聯網,網絡用戶呈爆炸式增長,而且用戶數還在持續增長。因此這位工程師認為用插入排序按照用戶姓名來構建聯繫人列表,性能會更佳。

關於為什麼不單單使用默認排序算法這一問題,我們也經過了反覆討論。最後結論是,使用默認排序算法需要對實現進行適當的測試和相應基準測試,這可能需要更多的工作。我個人認為這樣做沒有多大意義,並且當時我們正處在項目階段,有很多時間,所以採用了基於聯繫人列表的插入排序算法。

在現實世界中,一定有一些情況,使用高效的排序算法非常重要,並且基於數據選擇使用的排序算法會更加有效。在執行大規模實時數據流並且為這些數據源構建實時可視化時,插入排序很有用。

如果涉及到存儲在不同節點上的大量數據,那麼「分而治之」的歸併排序算法比較合適。我自己沒有使用過這些算法,因此了解這幾種不同的算法之外,我仍然會標記一些自己沒有用過的排序算法。

哈希表和哈希:隨處常見

我最常用到的數據結構就是哈希表以及哈希函數了。從計數、重複檢測、緩存到分片(sharding)之類的分布式系統用例,都會用到這種很方便的工具。

除了數組之外,在很多情況下用哈希表和哈希函數都是非常合適的。幾乎每種語言都會用到這種數據結構,而且它的實現很簡單。

棧和隊列:偶爾用到

任何調試過具有堆棧追蹤的語言的人都非常熟悉這種數據結構。我在使用這種數據結構時遇到了一些問題,但調試和性能分析讓我慢慢熟悉了它。

我很少在自己的代碼中使用隊列這種數據結構,但卻在代碼庫、代碼 pop 和 push 中遇到過很多次。對於分析和配置 builds 的安裝瓶頸檢測器工具而言,我會使用 Python 堆隊列(heap queue)算法來讀優先隊列優化後的代碼。

加密算法:Uber

Uber 很早就使用了幾種語言和技術,並且加密(cryptography)並不能實現我們需要的穩定性。典型的示例就是 iOS 和安卓。來自客戶端用戶輸入的敏感信息在通過網絡發送之前需要加密,同時僅針對特定服務進行解密。

在某些情況下,我們必須自己構建加密 / 解密實現。但在缺少支持框架或沒有可用審核庫的情況下,我們需要對其進行正式的驗證和審核。

構建加密算法總是充滿樂趣。在實現加密算法上存在許多挑戰:你想不出一種實現加密技術的新算法。取而代之的是,你將採用適合案例的現有的已成文的標準,然後驗證並一遍又一遍地審核它。

這種情況就是在實現 AES 標準。這是一個有趣的挑戰。我們已經構建了一些移動端和網頁端的加密實現,其中我自己深入學習了高級加密標準(AEP)、哈希消息身份驗證碼(HMAC)以及 RSA 公鑰加密的詳細知識。

研究攻擊媒介(如消息篡改或拒絕服務的影響)是審核解決方案的一部分。驗證一系列加密步驟是否可以證明是安全的,這

也是一件有趣的事。

只要證明 Encrypt-and-MAC(EaM)、MAC-then-Encrypt(MtE)和 Encrypt-then-MAC(Etm)三者有一個是安全的即可,但這並不意味著其他的是不安全的。

概率論與預測:Uber 的 SubmitQueue

2016 年,我加入了 Uber。移動端最大的痛點是構建以及合併更改需要花費的時間。從構建和所有測試(單元、集成和端到端)開始,構建一個完整的運行大約需要 40 分鐘。我們在開發中投入了大約 300 個開發者。所有的更改必須在落地之前搭建完成。

我旁邊的開發者體驗團隊想解決以下問題,他們從兩個角度做到了。首先,他們加快了構建和測試過程,耗時不超過 30 分鐘;其次,他們的目標是每個人的變更應該花費 30 分鐘,現有時間的 95%。

但是合併衝突呢?讓我們對其進行預測,並相應地建立隊列。這就是他們通過創建衝突和推測圖所做的事情。

帶有層次化索引的六邊形網格:Uber

這是我沒有參與的最後一個項目,但是我發現並使用了基於它的工具。在這裡,我了解了一種新的數據結構:帶有層次化索引的六邊形網格。

Uber 要解決的最困難和最有趣的問題之一就是優化行程價格以及合作夥伴的調度。價格是動態的,驅動程序也在不斷變化。H3 是 Uber 工程師構建的網格系統,旨在以越來越細化的水平可視化和分析整個城市的數據。數據可視化結構就是帶有層次化索引的六邊形網格。

總結

這些是我多年來在多家公司中實際使用的算法和數據結構的重點。

要在一家高科技公司工作,你不需要了解流行算法或是外來數據結構的工作原理。你應該了解算法是什麼,並且能夠自己提出一些簡單的算法,例如貪婪算法。你還應該了解更多常見的基本數據結構,例如哈希表、隊列、棧等等。但是你不需要記住 Dijkstra 或者 A* 這樣特殊的算法。

你可以將它們作為參考,就像我實現加密算法時一樣。對待紅黑樹或 AVL 樹等一些不常見的數據結構也應如此。我從未用過這些數據結構。即使我用過,也不會反覆查看它們。我也從來沒有問過需要使用這些知識才能解決的問題,將來也不會。

我一直在尋求一些實際的編碼例子,因為實際的例子中會有很多好的解決方案,比如暴力枚舉、貪心算法或其他一些更複雜的算法。比如,有些問題,你只需要一個數組和一些 if/else 語句就可以解決問題,而無需任何複雜的數據結構。

現實情況是,許多團隊和公司都面臨算法的挑戰。應該看到,算法問題具有很大的吸引力,它們能夠在 45 分鐘或者更短的時間內給出信號,並且輕鬆地轉換問題。因此問題洩漏帶來的影響並不會很嚴重。

招聘也比較容易。因為你可以擁有 100 多個問題的問題庫,任何面試官都可以評估其中的任何一個。特別是在矽谷,聽到動態編程和特殊數據結構問題的情況越來越多。這些問題將有助於聘請強大的工程師,但同時也會導致將那些本不需了解一些複雜算法但卻非常優秀的人拒之門外。

原文連結:https://blog.pragmaticengineer.com/data-structures-and-algorithms-i-actually-used-day-to-day/

Amazon SageMaker 是一項完全託管的服務,可以幫助開發人員和數據科學家快速構建、訓練和部署機器學習 模型。SageMaker完全消除了機器學習過程中每個步驟的繁重工作,讓開發高質量模型變得更加輕鬆。

現在,企業開發者可以免費領取1000元服務抵扣券,輕鬆上手Amazon SageMaker,快速體驗5個人工智慧應用實例。

原標題:《「走過」微軟、優步,老工程師告訴你哪些數據結構和算法最重要》

閱讀原文

相關焦點

  • 我們到底該如何學習《數據結構與算法》
    前言:我們到底該不該學習算法與數據結構?1、真的應該學習這個問題本身就不是個問題,所有人都在強調數據結構與算法比較重要,但是好像平時也沒用到,無法直觀的去感受它的重要性,於是把學習重心放在了常見的哪些框架身上,似乎只要熟悉了哪些框架的API,編程就會所向披靡。
  • 算法工程師和數據科學家處理大規模的交易數據
    你可以閱讀原文本文將科學技術和實際現實的各種交叉融合,通過自動駕駛服務平臺搭建一個可以持續運行、人性化和智能化的服務,包括uber無人駕駛汽車。從構思到實施一個優質、易用、可拓展的服務平臺,需要足夠的資料庫。要實現低成本、高可靠性、更快速度和更好用的訓練集,還需要強大的算力系統。計算機視覺,機器學習和深度學習是計算機科學中最重要的研究領域之一。
  • 阿里三面慘遭被虐,關於數據結構與算法竟然一竅不通!
    《數據結構與算法 經典問題解析》一書,涵蓋世界知名IT公司技術面試的程序設計問題及其解題思路解析IT頂尖企業(微軟、谷歌、亞馬遜、雅虎、臉譜、蘋果、Adobe )的面試過程,針對不同問題,提供多個具有不同複雜度的解決方法。兼顧自學教材和面試輔導的不同需求。
  • 圖解:數據科學家、數據工程師和軟體工程師之間的區別
    對於新手,也可以通過這張圖來看典型的「數據科學家」、「數據工程師」和「軟體工程師」都要掌握哪些工具。Jake Stein:隨著數據的爆炸式增長,對數據處理的專家技能需求也隨之井噴。這帶來的結果之一,是更精細的分工。對於數據管理工作的核心角色:數據科學家、數據工程師和軟體工程師,過去幾年見證了他們越來越清晰的定位。
  • 算法工程師路線圖(經驗濃縮,純乾貨!)
    說起算法(Algorithm),需要值得注意的是,數據結構與算法,機器學習算法都可簡稱為算法,但兩者是完全不同的。數據結構與算法是計算機科學中的一門基礎課程,主要內容是關於如何設計電腦程式,使得程序能夠運行更快,佔用內存更少。通常所說的程式設計師面試要刷算法題,指的便是數據結構與算法中的算法。
  • 科技巨頭數據科學面試真題:你能答出多少-科技巨頭,面試,題目...
    來自Glassdoor的最新數據可以告訴我們各大科技公司最近在招聘面試時最喜歡向候選人提什麼問題。首先有一個令人惋惜的結論:根據統計,幾乎所有的公司都有著自己的不同風格。由於Glassdoor允許匿名提交內容,很多樂於分享的應聘者向大家提供了Facebook、谷歌、微軟等大公司的面試題。我們把其中的一部分列出以供大家參考。
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • 20世紀最偉大的算法有哪些呢?
    20世紀最偉大的算法有哪些呢?作為一名數據分析師,經常會用到一些算法,這些算法為日常的工作帶來了很大的便利。本文介紹了經典算法,一起來看看有沒有你熟悉的吧~蒙特卡洛方法統計模擬方法蒙特·卡羅方法,也稱統計模擬方法,是二十世紀四十年代中期由於科學技術的發展和電子計算機的發明,而被提出的一種以概率統計理論為指導的一類非常重要的數值計算方法。
  • 數據科學家和工程師的「五誡」
    對於大多數團隊來說,兩者之間的關係「正介於不存在和無法作用之間」。這對於大部分過於樂觀的人無疑是一記痛擊吧!那麼,為什麼會產生這種不和諧的關係,如何能避免這種不和諧?在這篇簡短的文章中,我們將介紹五個「誡律」用於使數據科學家和工程師之間更合拍。快拿本本記下來。1、了解你的數據好的模型依賴於好的數據。
  • 微軟全球資深副總裁Peter Lee和我們聊了聊微軟神秘部門NExT
    微軟這個神秘而低調的部門,從不主動尋求曝光,卻常有項目被 CEO Satya Nadella 掛在嘴邊;它不僅有微軟亞洲研究院(MSRA)及其合作實驗室做其科研後盾,還有微軟工程院的諸多工程師「大牛」隨時待命,把成員們的奇思異想變成現實。
  • 數據結構與算法-2
    舉例:從前有座山,山裡有座廟,廟裡有個老和尚講故事。講的是從前有座山,山裡有座廟.....(階乘、Fibonacci數列)。分治定義:map reduce的思想,把大的問題分解(Divide)成一個個小問題。把小問題的解(Conquer)一個個的合併(Combine)起來,分治是藉助遞歸去解決的。
  • 如何成為一名大數據工程師?
    數據科學家更關注與數據基礎設施的互動,而不是去創建和維護數據基礎設施。通常負責進行市場和業務運營研究,以確定趨勢和關係,數據科學家用各種複雜的機器和方法與數據進行交互並對其採取行動。數據科學家通常精通機器學習和高級數據建模,因為他們希望藉助高級數學模型和算法將原始數據轉化為可操作的,可理解的內容。這些信息通常用作分析來源,以告訴決策者「更大的圖景」。
  • Java數據結構和算法——圖
    1.2 圖的存儲原理1.2.1 鄰接矩陣存儲圖最直觀的一種存儲方法就是,鄰接矩陣(Adjacency Matrix),鄰接矩陣的底層是一個二維數組。如果是無向圖,如果頂點 i 與頂點 j 之間有邊,我們就將A[i][j]和 A[j][i]標記為 1。
  • 機器人結構工程師薪資_中國機器學習工程師薪資 - CSDN
    這是銀行標配的一個模型,最常見最傳統的算法用的就是邏輯回歸。在課堂上使用的工具是SAS,SPSS,屬於有操作界面的,菜單非常齊全,只需要滑鼠點一點就能建模,很好上手。但是SAS這些要付錢的,年費還是相當的貴,所以深圳大部分公司進行數據分析和建模工作都選擇開源免費的R語言或者Python。這就體現了掌握一門程式語言的重要性。
  • 成為一名產品結構工程師需要掌握哪些技能
    在決定踏上成為一名產品結構工程師的開始,大家都很迷茫,因為這份職業不像其它職業,在大學有完全對口的專業,更多是相關專業的人轉行過來,比如機械設計師,工業設計師,模具設計師,數控等等人才轉到產品結構設計。
  • 如何成為一名數據分析師?
    這是一個用數據說話的時代,也是一個依靠數據競爭的時代。目前世界500強企業中,有90%以上都建立了數據分析部門。IBM、微軟、Google等知名公司都積極投資數據業務,建立數據部門,培養數據分析團隊。各國政府和越來越多的企業意識到數據和信息已經成為企業的智力資產和資源,數據的分析和處理能力正在成為日益倚重的技術手段。
  • 編程世界中的18個重要的算法
    下面是一些比較重要的算法,原文羅列了32個,但我覺得有很多是數論裡的,和計算機的不相干,所以沒有選取。
  • 2020數據分析崗位報告:數據分析師需要哪些能力?
    數據分析崗位報告:數據分析師需要哪些能力?公司最需要的技能是什麼?在這個行業中最需要的經驗水平是什麼?哪些公司在積極提供這個領域的工作?哪些地方有更多的空缺職位?注意:你可以在結論部分找到完整代碼的連結。
  • 10大機器學習算法,看懂你就是數據科學家
    想成為數據科學家?你得是個博聞強識,又對新鮮事物保持好奇心的人。正因為如此,數據科學家會掌握幾乎所有的常見算法,並精通其中一門,這樣可以快速適應新領域的問題。今天我們就來聊聊,每一位數據科技家都應該了解的10大機器學習算法。
  • 賈佳亞教授正式加盟騰訊優圖,計算機視覺大師的光榮與夢想
    優圖實驗室創立於2012年,專注在圖像處理、模式識別、機器學習、數據挖掘等領域開展技術研發和業務落地,至今已有近5年的歷史。經過近幾年發展,優圖實驗室在人工智慧多個領域積累了領先的技術實力和解決方案。特別是在人臉識別領域,優圖實驗室已多次在MegaFace 、LFW等國際人工智慧的權威比賽中刷新世界紀錄。視覺識別是人工智慧的核心和重要入口,而人工智慧的研究必須建立在海量數據基礎之上,通過大數據訓練來優化算法模型。加入優圖實驗室之後,我期待能夠依託於騰訊社交網絡大平臺產生的海量數據進行研究。