最長遞增子序列_python_算法與數據結構

???? 周末了,實驗室的網速還是不給力啊,不知道doctors都在干啥,,,最近都在做算法作業,昨天晚上看了一部電影《將愛進行到底》,剛打開電影沒多久就聽到了很熟悉的旋律,讓我很是驚訝,這竟然就是電視版的那首主旋律,十幾年過去了,徐靜蕾從初出茅廬到現在成為了老徐,我也從黃毛丫頭到現在成為了男子漢,浮生若夢,歲月流沙。將愛電影的主題曲《因為愛情》很好聽,王菲的聲音空靈虛無縹緲,與陳奕迅共同演繹了一首溫馨甜蜜的歌曲。

??? 言歸正傳,到算法上來了,最長遞增子序列問題在這里不再啰嗦了,不懂的自己baidu去,不過我更喜歡google,呵呵。個人的愛好吧。

??? 最長遞增子序列有兩種解法,一種是借助前面的LCS算法,另外是本文要寫的另外一種方法。

?? 1.LCS

????? LCS算法比較的是任意兩個序列的最長公共子序列,在最長遞增子序列中,我們將原序列A首先升序排列得到B,然后將A和B求LCS就可以達到目的。在這里不再贅述,有關LCS算法,可以參見前面的文章。

?? 2.網上流傳兩種版本的最長遞增子序列算法,http://hi.baidu.com/newmyl/blog/item/12f15e97ac88b06854fb965d.html連接對這個算法進行了深入的分析。我個人比較贊同http://www.felix021.com/blog/read.php?1587&guid=5的分析(http://blog.csdn.net/fisher_jiang/archive/2008/05/13/2442348.aspx也對這個算法進行了分析但是本人覺得比較晦澀難懂,C++STL我不習慣,高手自己揣摩吧~~~~),摘錄如下:

假設存在一個序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出來它的LIS長度為5。
下面一步一步試著找出它。
我們定義一個序列B,然后令 i = 1 to 9 逐個考察這個序列。
此外,我們用一個變量Len來記錄現在最長算到多少了
首先,把d[1]有序地放到B里,令B[1] = 2,就是說當只有1一個數字2的時候,長度為1的LIS的最小末尾是2。這時Len=1
然后,把d[2]有序地放到B里,令B[1] = 1,就是說長度為1的LIS的最小末尾是1,d[1]=2已經沒用了,很容易理解吧。這時Len=1
接著,d[3] = 5,d[3]>B[1],所以令B[1+1]=B[2]=d[3]=5,就是說長度為2的LIS的最小末尾是5,很容易理解吧。這時候B[1..2] = 1, 5,Len=2
再來,d[4] = 3,它正好加在1,5之間,放在1的位置顯然不合適,因為1小于3,長度為1的LIS最小末尾應該是1,這樣很容易推知,長度為2的LIS最小末尾是3,于是可以把5淘汰掉,這時候B[1..2] = 1, 3,Len = 2
繼續,d[5] = 6,它在3后面,因為B[2] = 3, 而6在3后面,于是很容易可以推知B[3] = 6, 這時B[1..3] = 1, 3, 6,還是很容易理解吧? Len = 3 了噢。
第6個, d[6] = 4,你看它在3和6之間,于是我們就可以把6替換掉,得到B[3] = 4。B[1..3] = 1, 3, 4, Len繼續等于3
第7個, d[7] = 8,它很大,比4大,嗯。于是B[4] = 8。Len變成4了
第8個, d[8] = 9,得到B[5] = 9,嗯。Len繼續增大,到5了。
最后一個, d[9] = 7,它在B[3] = 4和B[4] = 8之間,所以我們知道,最新的B[4] =7,B[1..5] = 1, 3, 4, 7, 9,Len = 5。
于是我們知道了LIS的長度為5。
!!!!! 注意。這個1,3,4,7,9不是LIS,它只是存儲的對應長度LIS的最小末尾。有了這個末尾,我們就可以一個一個地插入數據。雖然最后一個d[9] = 7更新進去對于這組數據沒有什么意義,但是如果后面再出現兩個數字 8 和 9,那么就可以把8更新到d[5], 9更新到d[6],得出LIS的長度為6。
然后應該發現一件事情了:在B中插入數據是有序的,而且是進行替換而不需要挪動——也就是說,我們可以使用二分查找,將每一個數字的插入時間優化到O(logN)~~~~~于是算法的時間復雜度就降低到了O(NlogN)~!

個人覺得他的分析十分清晰明了,真正能讓我們知道動態規劃算法的過程。按照這種思路,我實現了Python版本的LIS算法:

#最長單調遞增子序列
def LIS(B, d, n):left = right = mid =  len = 1B[0] = d[0]   # //從0開始計數for i in range(1, n):left = 0right = lenwhile(left <= right):mid = (left + right) // 2if(B[mid] < d[i]):left = mid + 1 #二分查找d[i]的插入位置else:right = mid - 1B[left] = d[i] #插入if(left > len) :len = len +1 #更新lengthreturn lenif '__name__ = __main__' :d = [2 , 1 , 5 , 3 , 6,  4,  8,  9,  7]  B=[0]*len(d)  #初始化B數組print(LIS(B, d, len(d)))

?

輸出結果:

Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on CHENX, Threaded
>>> 5

posted on 2011-03-20 22:16 追求卓越 挑戰極限 閱讀(...) 評論(...) 編輯 收藏

刷新評論刷新頁面返回頂部

導航

  • 博客園
  • 首頁
  • 新隨筆
  • 聯系
  • 訂閱訂閱
  • 管理

統計

  • 隨筆 - 27
  • 文章 - 0
  • 評論 - 21
  • 引用 - 0

公告

轉載于:https://www.cnblogs.com/ChenxofHit/archive/2011/03/20/1989760.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386285.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386285.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386285.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

美團Android開發工程師崗位職能要求,高級面試題+解析

前言 不知道大家面試的時候&#xff0c;有沒有遇到這種情況&#xff0c;面試工資談的是10K&#xff0c;最后干著40K的活&#xff01;說著冠冕堂皇&#xff0c;提升大家能力的話&#xff0c;做著死命壓榨員工&#xff0c;996成了程序員心里的魔咒&#xff01; 初級安卓開發工程…

美團點評APP在移動網絡性能優化的實踐,吊打面試官系列!

一. 開發背景 想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣。 Android 相關 1. Android 之 SharedPreferences 內部原理淺析 2. Android 源碼分析-消息隊列和 Looper 3. Android 源碼分析…

軟件工程團隊項目Alpha版本產品介紹

經過完整的用戶場景定義、功能設計、開發和測試&#xff0c;耗時一個月&#xff0c;我們軟件工程的團隊項目“Academic search Conference helper”的alpha版本總算在近日出爐了。下面就來簡單介紹一下我們的產品。事實上&#xff0c;“Academic search Conference helper”是“…

美團點評APP在移動網絡性能優化的實踐,趕快收藏備戰金九銀十!

導語 事情是這樣的&#xff0c;一個關注我公眾號很久了的朋友&#xff0c;最近跟我說要去面試阿里P6&#xff0c;其實他的水平P7是夠了的&#xff0c;他開發了6年&#xff0c;一直在學習新的技術&#xff0c;Flutter&#xff0c;NDK&#xff0c;這些都有涉及&#xff0c;年紀也…

Linux學習筆記24——進程管道

一 管道的作用 通常把一個進程的輸出通過管道連接到另一個進程的輸入。 二 popen和pclose函數 #include <stdio.h>FILE *popen(const char *command,      //是要運行的程序名和相應的參數       const char *open_mode      //必須是“r”或者“w”,如…

耗時兩個禮拜,8000字安卓面試長文,建議收藏

本專欄專注分享大型Bat面試知識&#xff0c;后續會持續更新&#xff0c;喜歡的話麻煩點擊一個關注 面試官: ButterKnife為什么執行效率為什么比其他注入框架高&#xff1f;它的原理是什么 心理分析&#xff1a; ButterKnife框架一直都是使用&#xff0c;很少又開發者對butterkn…

VS2010常用快捷鍵

1、自動排版 編輯.格式化選定內容 Ctrl K&#xff0c;Ctrl F(form)根據周圍的代碼行&#xff0c;正確縮進選定的代碼行。 2、注釋與去掉注釋功能。 編輯.注釋選定內容 Ctrl K&#xff0c;Ctrl C(comment) 使用編程語言的正確注釋語法將代碼的當前行標記為注釋。 編輯.取消注…

騰訊+字節+阿里面經真題匯總,Android篇

簡介 首先&#xff0c;Android是不是真的找工作越來越難呢&#xff1f;這個可能是大家最關心的。這個受大的經濟環境以及行業發展前景的影響&#xff0c;同時也和個人因素有關。 近期一方面是所在的公司招聘Java開發人員很難招到合適的&#xff0c;投簡歷的人很少&#xff1b;…

border-image圖片邊框

一、border-image的兼容性 1、支持到IE11以上&#xff0c;其他主要瀏覽器均支持 2、使用webkit以后支持android4.3以上 二、border-image的參數&#xff08;包括圖片、裁剪位置、重復性&#xff09; 1、圖片&#xff08;border-image-source&#xff09;采用url&#xff08;&am…

騰訊3輪面試都問了Android事件分發,原理+實戰+視頻+源碼

一、架構師專題 想要掌握復雜的技術&#xff0c;必須要理解其原理和架構。本模塊結合實際一線互聯網大型項目理解架構思維&#xff0c;抽絲剝繭&#xff0c;層層深入&#xff0c;幫助大家成為Android架構師&#xff0c;在思想上對架構認識有一次升華&#xff0c;并知其所以然&a…

Java自學筆記(16):常用類:Math,Data和Calender,Format,Scanner

Math類 位于java.lang包&#xff0c;主要用于基本的算術運算&#xff0c;包含的成員都是靜態的&#xff0c;可以直接調用 兩個常量&#xff1a;PI&#xff0c;E 方法&#xff1a; sin(double a) 返回角的三角正弦。 cos(double a) 返回角的三角余弦。 tan(double a) 返回角的三…

熬夜肝完這份Framework筆記,已拿到offer

第一次觀看我文章的朋友&#xff0c;可以關注、點贊、轉發一下&#xff0c;每天分享各種干貨技術和程序猿趣事 前言 隨著移動終端的快速發展&#xff0c;Android開發人員也越來越多&#xff0c;Android開發市場也進入了一個飽和的狀態&#xff0c;Android開發人員也面臨著難找…

[LoadRunner]UTF8字符格式

前一編說到xmlrpc調用操作&#xff0c;由于有時候在xmlrpc里有中文字符的請求&#xff0c;但由于上傳的請求與服務器的編碼不匹配&#xff0c;會導致請求不成功。 那么我們就需要把服務端的編碼與客戶端的編碼統一&#xff0c;這里說一下uft8中文字符轉換 int XmlBody() {char …

現在做Android開發有前途嗎?復習指南

背景 知乎客戶端中有一個自己維護的 Hybrid 框架&#xff0c;在此基礎上開發了一些 Hybrid 頁面&#xff0c;當需要前端或者客戶端開發接口的時候&#xff0c;就涉及到聯調的問題。 和一般的 前端 <> 服務端&#xff0c;或者 客戶端 <> 服務端 類似&#xff0c;前…

TreeSet

/*Set : 無序&#xff0c;不可以重復元素|--HashSet:數據結構是哈希表&#xff0c;線程是非同步的保證元素唯一性原理&#xff1a; 判斷元素的HashCode值是否相同如果相同&#xff0c;還會繼續判斷元素的equals方法是否為True|TreeSet: 可以對集合中的元素進行排序底層數據結構…

現在做Android開發有前途嗎?社招面試心得

開頭 面試時間&#xff1a;2021.2.9 1~3面、2021.2.13 4~6面、2021.2.26 HR面 面試部門 崗位&#xff1a;商業化 - 高級 Android 開發工程師 面試感想&#xff1a;整體面得比較累&#xff0c;基礎面、交叉面、Boss面&#xff0c;前前后后對接了 6 個面試官 (離當初給我說的 3面…

現在做Android開發有前途嗎?附面試題答案

開頭 籠統來說&#xff0c;中年程序員容易被淘汰的原因其實不外乎三點。 1、輸出能力已到頂點。這個人奮斗十來年了&#xff0c;依舊碌碌無為&#xff0c;很明顯這人的天花板就這樣了&#xff0c;說白了&#xff0c;天賦就這樣。 2、適應能力越來越差。年紀大&#xff0c;有家…

C++開發WPF,Step by Step

C開發WPF&#xff0c;Step by Step 示例代碼 使用C來開發WPF&#xff0c;主要是如何在MFC&#xff08;Win32&#xff09;的窗口中Host WPF的Page。下面我就做個詳細的介紹. 一、創建工程, 由于MFC的Wizard會生成很多用不到的代碼&#xff0c;所以我準備從一個空的工程開始創建一…

C#學習之unsafe

為了保持類型安 全&#xff0c;默認情況下&#xff0c;C# 不支持指針算法。 不過&#xff0c;通過使用 unsafe 關鍵字&#xff0c;可以定義可使用指針的不安全上下文。 unsafe 在C# 程 序中的使用場合&#xff1a; 1&#xff09;實時應用&#xff0c;采用指針來提高性能&…

百度、華為、京東、B站最新面試題匯集,實戰篇

前言 回顧一下自己這段時間的經歷&#xff0c;因公司突然通知裁員&#xff0c;我匆匆忙忙地出去面了幾家&#xff0c;但最終都沒有拿到offer&#xff0c;我感覺今年的寒冬有點冷。公司開始第二波裁員&#xff0c;我決定主動拿賠償走人。后續的面試過程我做了一些準備&#xff…