數據結構:塊狀鏈表

一、概述

???????????有時候我們需要設計這樣一種數據結構:它能快速在要求位置插入或者刪除一段數據。先考慮兩種簡單的數據結構:數組和鏈表。數組的優點是能夠在O(1)的時間內找到所要執行操作的位置,但其缺點是無論是插入或刪除都要移動之后的所有數據,復雜度是O(n)的。鏈表優點是能夠在O(1)的時間內插入和刪除一段數據,但缺點是在尋找操作位置時,卻要遍歷整個鏈表,復雜度同樣時O(n)的。這兩種數據結構各有優缺點,我們可以把數組和鏈表的優點結合來,這就構成了一個新的數據結構:塊狀鏈表,結合數組和鏈表的優缺點的塊狀鏈表其各種操作的時間復雜度均為O(sqrt(n))。

二、塊狀鏈表的各種操作

???????????塊狀鏈表是結合了數組和鏈表的優缺點,塊狀鏈表本身是一個鏈表,但是鏈表儲存的并不是一般的數據,而是由這些數據組成的順序表。每一個塊狀鏈表的節點,也就是順序表,可以被叫做一個塊。塊狀鏈表通過使用可變的順序表的長度和特殊的插入、刪除方式,可以在達到的復雜度。塊狀鏈表另一個特點是相對于普通鏈表來說節省內存,因為不用保存指向每一個數據節點的指針。

1、定位操作

???????? 定位操作其實可以當作是查找,我們當然是先要定位到元素所在的節點,然后在該節點里面的數組里面尋找我們要的節點;

2、分裂節點

???????? 將某個節點分裂成兩個節點;

3、插入操作

???????? 首先定位要插入的位置,然后將所在節點分裂成兩個節點,并將數據放到第一個節點的末尾。 如果要插入的是一大塊數據,首先要將數據切成多個塊其中、每個塊對應一個塊狀鏈表的一個節點,并將這些塊鏈起來,然后將它們插入那兩個節點之間。插入的操作圖類似下面:


4、刪除操作

???????? 首先定位刪除元素的位置,然后按照數組刪除元素的方法刪除該數據。如果刪除一大塊數據,首先要定位數據塊首元素和末元素所在的位置,然后分別將它們所在的節點分裂成兩個節點,最后刪除首元素和末元素之間的節點即可。


三、關鍵技術

???????????從總體上來看,維護一個鏈表,鏈表中的每個單元中包含一段數組,以及這個數組中的數據個數。每個鏈表中的數據連起來就是整個數據。設鏈表長度為a,每個單元中的數組長度是b。無論是插入或刪除,在尋址時要遍歷整個鏈表,復雜度是O(a);對于插入操作,直接在鏈表中加入一個新單元,復雜度是O(1);對于刪除操作,會涉及多個連續的單元,如果一個單元中的所有數據均要刪除,直接刪除這個單元,復雜度是O(1),如果只刪除部分數據,則要移動數組中的數據,復雜度是O(b)。總的復雜度是O(a+b)。因為ab=n,取a=b=√n,則總的復雜度是O(√n)。

???????? 問題是如何維護a和b大致等于√n?

???????? 在執行插入操作后,如果當前單元中的數據個數>2√n,則將當前單元分割成兩個新單元,每個單元中的數據個數保持為2√n。在執行刪除操作后,如果當前單元和當前單元的下一個單元的數據個數和<√n,則將兩個單元合并成一個新單元。執行上述維護操作需要移動數組中的數據,復雜度是O(b),對于單元的分割和合并均是O(1)的,總的復雜度是O(b)的。這樣,維護操作并不會使總復雜度增加。最終得到一個復雜度是O(√n)的數據結構。

四、應用

1、文本編輯器:http://download.noi.cn/T/noi/noi2003A.pdf

另一種實現:http://www.byvoid.com/blog/noi-2003-editor/

2、維護數列:http://download.noi.cn/T/noi/noi2005A.pdf

另一種實現:http://www.byvoid.com/blog/noi-2005-sequence/

?轉載請注明:http://blog.csdn.net/w397090770/article/details/8299895

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

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

相關文章

記賬本開發小計(四)

今天處理的是記賬本小軟件中的查詢功能&#xff0c;由于賬目的要求就是準確性&#xff0c;所以對于記賬本程序來說&#xff0c;模糊查詢并不適用&#xff0c;所以在這里只能是按照指定的條件來進行查詢所以我做的事按照時間進行查詢&#xff0c;為了方便進行處理&#xff0c;這…

Linux ps命令、Linux top命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux ps命令用于顯示當前進程 (process) 的狀態。 語法 ps [options] [--help][options] [--help] 參數&#xff1a; ps 的參數非常…

Prime Distance POJ - 2689 線性篩

一個數 $n$ 必有一個不超過 $\sqrt n$ 的質因子。 打表處理出 $1$ 到 $\sqrt n$ 的質因子后去篩掉屬于 $L$ 到 $R$ 區間的素數即可。 Code: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const…

給定a和n,計算a+aa+aaa+a...a(n個a)的和(大數據處理)

題目描述&#xff1a;給定a和n&#xff0c;計算aaaaaaa...a(n個a)的和。 輸入&#xff1a;測試數據有多組&#xff0c;輸入a&#xff0c;n&#xff08;1<a<9,1<n<100&#xff09;。 輸出&#xff1a;對于每組輸入,請輸出結果。 樣例輸入&#xff1a;1 10 樣例輸出&…

ssh和rsh的區別、Linux rsh命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ssh 和 rsh的區別主要有: 1 安全級別不同, 主要是ssh的密碼等都是加密傳輸,而且還有密鑰認證的機制, rsh明文傳輸. 而且沒有密鑰的機制.…

Java并發編程(多線程)中的相關概念

眾所周知&#xff0c;在Java的知識體系中&#xff0c;并發編程是非常重要的一環&#xff0c;也是面試中必問的題&#xff0c;一個好的Java程序員是必須對并發編程這塊有所了解的。 并發必須知道的概念 在深入學習并發編程之前&#xff0c;我們需要了解幾個基本的概念。 同步和異…

4、容器虛擬化網絡概述

Docker 網絡 Docker 的網絡實現其實就是利用了 Linux 上的網絡名稱空間和虛擬網絡設備&#xff08;特別是 veth pair&#xff09;。 Linux 網絡命名空間&#xff1a;https://www.jianshu.com/p/369e50201bce Linux虛擬網絡設備之veth&#xff1a; https://segmentfault.com/a/1…

Linux whoami命令、Linux su命令、Linux w命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux whoami命令用于顯示自身用戶名稱。 顯示自身的用戶名稱&#xff0c;本指令相當于執行"id -un"指令。 語法 whoami […

Weekly 10

Algorithm 1.Remove Element What 移除數組中的指定元素,返回處理后的長度sum,并且數組前sum長度的元素為處理后的元素,不用額外數組&#xff0c;O(1)。How 用快慢指針,快指針遍歷,遇到不等于指定元素的替換掉慢指針,然后慢指針前進一位即可。Key Codesclass Solution {public …

大數據計算:如何僅用1.5KB內存為十億對象計數

摘要&#xff1a;AddThis的數據分析副總監Matt Abrams在High Scalability上發表了一篇文章&#xff0c;介紹了他們公司如何應對大數據。Matt Abrams表示&#xff0c;AddThis僅僅用了1.5KB內存的內存就計算了十億個不同的對象&#xff0c;這與他們所使用的計算方法分不開的。 A…

C#關鍵字的個人理解與注釋

C#關鍵字注釋&#xff1a;abstract&#xff1a;抽象as&#xff1a;類型轉換&#xff08;返回轉換結果&#xff09;base&#xff1a;基類bool&#xff1a;布爾類型break&#xff1a;條件中斷語句byte&#xff1a;字節case&#xff1a;條件語句catch&#xff1a;異常捕獲后執行ch…

Linux declare命令、Linux tail 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux declare命令用于聲明 shell 變量。 declare為shell指令&#xff0c;在第一種語法中可用來聲明變量并設置變量的屬性([rix]即為變…

詳解Nagios配置文件的邏輯關系

1.主配置文件/usr/local/nagios/etc/nagios.cfg a.定義了用戶和組 b.定義了某些具體參數 c.定義了配置文件和可以存放配置文件的文件夾 d.通過開頭的#號去注釋選項以達到關閉配置的效果 e.更改配置后&#xff0c;可以通過命令 /usr/local/nagios/bin/nagios –v /usr/local/na…

10 步讓你成為更優秀的程序員

這篇文章要介紹的&#xff0c;是我作為專業程序員這些年來學到的能真正提高我的代碼質量和整體工作效率的10件事情。 1. 永遠不要復制代碼 不惜任何代價避免重復的代碼。如果一個常用的代碼片段出現在了程序中的幾個不同地方&#xff0c;重構它&#xff0c;把它放到一個自己的函…

《流浪地球》 電影全集

《流浪地球》 電影全集 《流浪地球》是由郭帆導演&#xff0c;吳京特別出演&#xff0c;屈楚蕭、李光潔、吳孟達等人主演的科幻片《流浪地球》宣布定檔2019大年初一。同時&#xff0c;影片發布了一款定檔預告片&#xff0c;預告片開頭傳來一段廣播聲音&#xff1a;“太陽急速老…

kotlin之plus、copyOf、reverse、forEach、filter、map、reduce、fold等函數解釋和使用

kotlin之::函數調用、plus&#xff08;增加元素&#xff09;、copyOf&#xff08;復制數組&#xff09;、reverse&#xff08;翻轉數組&#xff09;、forEach&#xff08;遍歷數組&#xff09;、filter&#xff08;過濾數組&#xff09;、map函數操作及擴展、reduce函數、fold函…

linux 常用命令 雜記

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.cat cat 命令用于連接文件并打印到標準輸出設備上。 使用權限 所有使用者 2.Linux chgrp命令用于變更文件或目錄的所屬群組。 3.Linux…

C程序員要學C++嗎?

最近網友問到這一問題&#xff0c;但我更希望被問的是“C程序員需要學面向對象編程嗎&#xff1f;”&#xff0c;那就讓我先從回答這一問題開始&#xff0c;并做適當的擴展。 就我的成長經歷來看&#xff0c;C程序員必須學習面向對象編程&#xff01;面向對象編程語言有其天然的…

追女生心理研究(本人母胎單身,就是想做準備,并無其他意思)

聊天話題&#xff1a; 1。興趣愛好&#xff1a;美食&#xff0c;旅游&#xff0c;寵物等 2。現在和曾經的自己&#xff0c;分享自己的經歷 3。我變成我們&#xff0c;未來規劃 4。分析隱私&#xff0c;比如一些小秘密 5。價值觀&#xff0c;對未來的規劃等 聊天話題技巧 …

dlopen 和 dlsym 動態調用函數

Linux/unix 提供了使用 dlopen 和 dlsym 方法動態加載庫和調用函數&#xff0c;這套方法在 macOS 和 iOS 上也支持。dlopen 打開一個庫&#xff0c;獲取句柄。dlsym 在打開的庫中查找符號的值。dlclose 關閉句柄。dlerror 返回一個描述最后一次調用dlopen、dlsym&#xff0c;或…