腦洞大開--一條項目中常用的linux命令引發的經典演算法題

来源:http://www.cnblogs.com/xiexj/archive/2017/06/11/6973652.html
-Advertisement-
Play Games

小時候家裡定了《讀者》的月刊,裡面記錄一個故事:說有有個偏僻的鄉村一日突然來了一個美女,她攜著萬貫家財子女在當地安家落戶,成了當地的鄉紳。她讓她的子女世世代代的保守這個秘密,直到這個秘密不會再對家族帶來災難。她就是陳圓圓。當年吳三桂領清兵入關,衝冠一怒為紅顏,改寫了中國的歷史,自己卻能全身而退的那個 ...


  小時候家裡定了《讀者》的月刊,裡面記錄一個故事:說有有個偏僻的鄉村一日突然來了一個美女,她攜著萬貫家財子女在當地安家落戶,成了當地的鄉紳。她讓她的子女世世代代的保守這個秘密,直到這個秘密不會再對家族帶來災難。她就是陳圓圓。當年吳三桂領清兵入關,衝冠一怒為紅顏,改寫了中國的歷史,自己卻能全身而退的那個人。

  周五例行公事的查看一下離線數據推送項目的數據和log。將log用awk分段之後,我想知道實時數據前10個被重覆發送的數據ID都被重覆發送了幾次,從而找到進一步優化的入手點,天知道我對這個項目已經進行了多少次優化了。於是linux命令就是

 cat transmission.log |grep 'IncrementAlbumService.java:146'|awk '{print $6}'|awk -F ',' '{print $1}'| sort |uniq -c| sort -nr |head

  得到的結果令我很自責

(數據安全,對於我們項目的ID規則部分不顯示)

雖然這和他們的操作有關,我本來就是該檢測到數據變更就發送出去,但是對於這麼大的重發率。不管從更新服務的介面上,還是離線服務上,能夠優化的點還是有的。姑娘我的思路一向與那些出場要用吹風機,人工噴壺製造畫面感的男神大佬思路不同。除了這個結果,我還在想另外一個經典演算法問題:說是有一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前十個詞。

  這個演算法問題使用上面的linux命令就是sort|uniq -c |sort -nr | head。時間複雜度為下麵幾項中最大的一個:

  1>先是做一次排序,

    直接插入排序:不斷將元素插入到有序表中去,最壞時間複雜度是O(n2)

    shell排序:縮小增量的插入排序,不穩定,有賴於增量因數序列的選取,最壞時間複雜度是O(n2)

    簡單選擇排序:在要排序的數中選擇最小或最大與第一個未排序位置交換,最壞時間複雜度是O(n2)

    二元選擇排序:每趟簡單選擇排序確定兩個元素,可減少一半的迴圈。

    堆排序:樹形選擇排序,大根堆,小根堆。最壞時間複雜度是O(N*logN)

    冒泡排序:每次相鄰的兩個數比較,交換,最壞時間複雜度是O(n2)

    快速排序:選擇基準元素,每次將待排序元素分割,最壞時間複雜度是O(n2)

    歸併排序:將兩個有序表合成一個新的有序表,最壞時間複雜度是O(N*logN)

    桶排序:以空間換時間的演算法,複雜度接近O(n)  

    基數排序:按照個十百千的位數進行分配收集,時間複雜度是O(dn)

   2>uniq 時間複雜度為O(n)

   3>sort時間服務度同1>

   4>已經排好序了時間複雜度就是O(1)

  採用的演算法也和文件的大小有關係,如果文件太大,數據太多,就需要將文件拆分,分別排序後做多路歸併。所以這裡說了文字數量。

  不用linux命令,經典的解決方法是先用字典樹統計詞頻,再用大根堆。先介紹一下字典樹,也叫tire樹。因為搜索引擎常用這個來做文本詞頻統計,分詞演算法也用這個作為基本數據結構,所以知道一些。它的優點是:最大限度的減少無謂的字元串比較,查詢效率高於哈希表。核心思想是以空間換時間,利用公共首碼來降低查詢時間的開銷。所以一說統計啥啥,首先想到的就是字典樹。如果在統計詞頻時維護一個前十位的最大詞頻數組之類的,在迴圈處理中比較,時間複雜度要翻10倍。所以還是先統計,再取top10時間效率上更為合適。

  其實我不咋懂演算法,只是會用。我之前一個同事看了我寫的一篇文章微信問我:“feed流是很有技術含量的工作嗎?” 他這個問題讓我想起《仙劍》里李逍遙在餐館里非要裝高富帥,說要點最名貴的菜:“青菜炒牛肉”,眾人哄笑,靈兒問李逍遙:“逍遙哥哥,青菜炒牛肉是很名貴的菜嗎?”。雖然同事是在真心的問我意見,因為他在京東,正在考慮要不要去陌陌,我卻感覺自己像那個沒見過世面的李逍遙。feed流這個業務邏輯怎麼都能做,有沒有技術含量取決於怎麼去做。我寫過一篇專利,介紹feed流的一種拼裝方法,流程沒走完,這之前我就先不公開計算方法了。但是努力去想的話,優化點還是很多的。前年我還比較喜歡玩朋友圈的時候,經常會發現自己刪除的朋友圈又出現了,或者自己的或者別人的朋友圈突然最近的數據全沒了,只有很老的數據,比如一年前兩年前的數據,一天之後自動恢復。都是策略的問題。微信朋友圈的問題挺多的。鑒於我們有個人見人愛花見花開的產品mm是微信架構師家屬,我就不過多吐槽了。

  雖說今天是周日,可以腦洞大開一下,也得有個主題。前面的例子有個經典的top K問題。因為搜索引擎會經常需要統計最熱門的查詢串,top K問題是基礎。TopK問題用小根堆。維護一個K大小的小根堆,遍歷要比較的元素,分別與跟元素做對比,如果小於根元素,說明肯定進不了前K,淘汰掉。如果大於根元素,就淘汰根元素。再調整樹為最小堆,繼續比較。

  最小堆的是一棵完全二叉樹,每個非葉子節點的值都不大於其子節點的值。如果破壞了這個規律,就要從第一個非葉子節點開始向根節點這種自下往上的順序進行調整。

  下周決定面一下hulu,還沒面,應該是面不過。兩年前原同事給推薦過亞馬遜,結果沒讓我去面試,安慰自己一下就是估計那時候他們其實是不招人的。從來沒去過這種外企面試,不知道是啥套路。如果現在開始準備的話,估計過了十一差不多能過。我想我自己去面試肯定很不占優勢。不是完全會不好,會很不穩定。看過我文章朋友大概會覺得我文章寫的很亂,很雜。生活中我也確實是這樣。知識面很廣,很異想天開,無所顧忌,這一方面為我的創造力奠定基礎,另一方面不利於我臨場發揮。大腦像是一個電腦。我的並行程式很多,記憶體不夠大,數據又多。記憶體分頁導致不斷和磁碟swap。面試這種有時效的動作很容易導致超時返回。我有那麼多技術發明專利,現在讓我想,我一個都想不起來自己發明瞭啥。剛剛坐公交車,因為人很少,司機師傅問我哪裡下車,意思是沒有人下車的地方就不停了。我想了很久才想起來。我的大腦更多運行在非同步非阻塞模式,其實面試這種事情同步阻塞反而會好一些。然而任何事情都有解決的辦法,找不到方法就是能力不夠了,沒什麼不服的。然而面試是要考察綜合能力的,比如團隊合作,談吐能力等等。相信我們部門的人都不會對“曉靜很聰明“這句話有異議。也相信部門或者工作上有合作的同事都不會覺得我是個很難溝通或者很難相處的人。但是在面試中我卻很可能會忘了要怎麼說話。但是如果因為這個問題我沒通過一個面試的話,我沒有怨言。因為面試官就是將來的同事和領導,如果不夠合拍的話,將來去了自己的能力也不一定能發揮出來。如果面試不好還覺得自己能力是夠的,那很有可能是自己格局不夠高,沒見過真正優秀的人是什麼樣子。然而我就是那種鐵定要碰壁的事還要做的人。如果一件事我決定放棄了,原因肯定是不值得做。

  喜歡工作,我的目標是60歲時還能有一份有創造性的工作。所以怕國內互聯網公司會讓我40歲就退休。還有一件最重要的事:我想做自己的搜索引擎中間件,國內的互聯網公司以用為主,怕是我很難有精力來做這件事情。當然,去不了hulu,搜索引擎也還是要做的。只是一個怎樣分配時間的問題。

  我其實是喜歡去碰壁的,大概是自己還不想那麼快長大吧。如果天天表現的很成熟優雅的樣子,就需要隱藏一些自己不擅長的,或者有可能出錯的事兒。結果每天日子也會很開心,但是可能一輩子也就這樣了。歷史上有很多著名的人物,原本都是紈絝子弟,後家道中落才逆襲成為偉人的。書里,人生的轉折有遇到貴人,和遇到挫折兩種。年輕時心態開放,遇到貴人打開思路就可以頓悟了。而隨著經歷的增多,人會更加有選擇的接收周圍的信息,這時候大概需要遇到很大的挫折才能重新思考人生。如果能看到更好的未來,我願獨孤一擲,破釜沉舟。大起大落總好過一年如一日,要活就活的精彩~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在資料庫伺服器異常斷電重啟後,資料庫會進行實例恢復,那麼實例恢復的過程中Oracle做了什麼操作呢?參考官網在這裡做一下解釋,菜鳥水平有限,歡迎勘正。 首先說下實例恢復的定義: Instance recovery is the process of applying records in the o ...
  • 知識重點: 1.extract(day from schedule01::timestamp)=13 Extract 屬於 SQL 的 DML(即資料庫管理語言)函數,同樣,InterBase 也支持 Extract,它主要用於從一個日期或時間型的欄位內抽取年、月、日、時、分、秒數據,因此,它支持其 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6970721.html 免責聲明: 本文僅供娛樂,從足彩的勝平負觀點出發來分析如何投註來實現收益的“最穩妥”,^O^ 本文不對任何足彩勝平負實際投資組合有任何指導建議,不對任何投資有任何責任。 勝平負的介紹以及組合方案押註 閱 ...
  • 有些hive安裝文檔提到了hdfs dfs -mkdir ,也就是說hdfs也是可以用的,但在2.8.0中已經不那麼處理了,之所以還可以使用,是為了向下相容. 本文簡要介紹一下有關的命令,以便對hadoop的命令有一個大概的影響,併在想使用的時候能夠知道從哪裡可以獲得幫助。 概述 在$HADOOP_ ...
  • 原文鏈接:http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/ 什麼是tensorflow model 模型訓練完畢之後,你可能需要在產品上使用它。那麼tens ...
  • 創建資料庫對於表的操作需要先進入庫 use 庫名;-- 創建一個名為 inana_db 的資料庫,資料庫字元編碼指定為 utf8create database inana_db character set utf8;drop database inana_db; -- 刪除 庫名為samp_db的庫 ...
  • 從MySQL5.5版本以後,開始引入並行複製的機制,是MySQL的一個非常重要的特性。 MySQL5.6開始支持以schema為維度的並行複製,即如果binlog row event操作的是不同的schema的對象,在確定沒有DDL和foreign key依賴的情況下,就可以實現並行複製。 社區也有 ...
  • Innodb_buffer_pool_pages_data Innodb buffer pool緩存池中包含數據的頁的數目,包括臟頁。單位是page。 Innodb_buffer_pool_pages_dirty innodb buffer pool緩存池中臟頁的數目。單位是page。 Innodb ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...