這篇文章主要介紹“web常用數(shù)據(jù)結(jié)構(gòu)及復(fù)雜度實(shí)例分析”,在日常操作中,相信很多人在web常用數(shù)據(jù)結(jié)構(gòu)及復(fù)雜度實(shí)例分析問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”web常用數(shù)據(jù)結(jié)構(gòu)及復(fù)雜度實(shí)例分析”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十多年品質(zhì),值得信賴!
如何選擇數(shù)據(jù)結(jié)構(gòu)
Array (T[])
當(dāng)元素的數(shù)量是固定的,并且需要使用下標(biāo)時(shí)。
Linked list (LinkedList<T>)
當(dāng)元素需要能夠在列表的兩端添加時(shí)。否則使用 List<T>。
Resizable array list (List<T>)
當(dāng)元素的數(shù)量不是固定的,并且需要使用下標(biāo)時(shí)。
Stack (Stack<T>)
當(dāng)需要實(shí)現(xiàn) LIFO(Last In First Out)時(shí)。
Queue (Queue<T>)
當(dāng)需要實(shí)現(xiàn) FIFO(First In First Out)時(shí)。
Hash table (Dictionary<K,T>)
當(dāng)需要使用鍵值對(duì)(Key-Value)來快速添加和查找,并且元素沒有特定的順序時(shí)。
Tree-based dictionary (SortedDictionary<K,T>)
當(dāng)需要使用價(jià)值對(duì)(Key-Value)來快速添加和查找,并且元素根據(jù) Key 來排序時(shí)。
Hash table based set (HashSet<T>)
當(dāng)需要保存一組唯一的值,并且元素沒有特定順序時(shí)。
Tree based set (SortedSet<T>)
當(dāng)需要保存一組唯一的值,并且元素需要排序時(shí)。
Array
在計(jì)算機(jī)程序設(shè)計(jì)中,數(shù)組(Array)是最簡(jiǎn)單的而且應(yīng)用最廣泛的數(shù)據(jù)結(jié)構(gòu)之一。在任何編程語言中,數(shù)組都有一些共性:
數(shù)組中的內(nèi)容是使用連續(xù)的內(nèi)存(Contiguous Memory)來存儲(chǔ)的。
數(shù)組中的所有元素必須是相同的類型,或者類型的衍生類型。因此數(shù)組又被認(rèn)為是同質(zhì)數(shù)據(jù)結(jié)構(gòu)(Homegeneous Data Structures)。
數(shù)組的元素可以直接被訪問。比如你需要訪問數(shù)組的第 i 個(gè)元素,則可以直接使用 arrayName[i] 來訪問。
對(duì)于數(shù)組的常規(guī)操作包括:
分配空間(Allocation)
數(shù)據(jù)訪問(Accessing)
在 C# 中,可以通過如下的方式聲明數(shù)組變量。
1 int allocationSize = 10;2 bool[] booleanArray = new bool[allocationSize];3 FileInfo[] fileInfoArray = new FileInfo[allocationSize];
上面的代碼將在 CLR 托管堆中分配一塊連續(xù)的內(nèi)存空間,用以容納數(shù)量為 allocationSize ,類型為 arrayType 的數(shù)組元素。如果 arrayType 為值類型,則將會(huì)有 allocationSize 個(gè)未封箱(unboxed)的 arrayType 值被創(chuàng)建。如果 arrayType 為引用類型,則將會(huì)有 allocationSize 個(gè) arrayType 類型的引用被創(chuàng)建。
如果我們?yōu)?FileInfo[] 數(shù)組中的一些位置賦上值,則引用關(guān)系為下圖所示。
但這些靈活性是以犧牲性能為代價(jià)的。在上面 Array 的描述中,我們知道 Array 在存儲(chǔ)值類型時(shí)是采用未裝箱(unboxed)的方式。由于 ArrayList 的 Add 方法接受 object 類型的參數(shù),導(dǎo)致如果添加值類型的值會(huì)發(fā)生裝箱(boxing)操作。這在頻繁讀寫 ArrayList 時(shí)會(huì)產(chǎn)生額外的開銷,導(dǎo)致性能下降。
List<T>
當(dāng) .NET 中引入泛型功能后,上面 ArrayList 所帶來的性能代價(jià)可以使用泛型來消除。.NET 提供了新的數(shù)組類型 List<T>。
泛型允許開發(fā)人員在創(chuàng)建數(shù)據(jù)結(jié)構(gòu)時(shí)推遲數(shù)據(jù)類型的選擇,直到使用時(shí)才確定選擇哪種類型。泛型(Generics)的主要優(yōu)點(diǎn)包括:
類型安全(Type Safety):使用泛型定義的類型,在使用時(shí)僅能使用指定的類型或類型的衍生類型。
性能(Performance):泛型移除了運(yùn)行時(shí)類型檢測(cè),消除了裝箱和拆箱的開銷。
可重用(Reusability):泛型打破了數(shù)據(jù)結(jié)構(gòu)與存儲(chǔ)數(shù)據(jù)類型之間的緊耦合。這提高了數(shù)據(jù)結(jié)構(gòu)的可重用性。
List<T> 等同于同質(zhì)的一維數(shù)組(Homogeneous self-redimensioning array)。它像 Array 一樣可以快速的讀取元素,還可以保持長(zhǎng)度可變的靈活性。
1 // 創(chuàng)建 int 類型列表2 List<int> myFavoriteIntegers = new List<int>();3 4 // 創(chuàng)建 string 類型列表5 List<string> friendsNames = new List<string>();
List<T> 內(nèi)部同樣使用 Array 來實(shí)現(xiàn),但它隱藏了這些實(shí)現(xiàn)的復(fù)雜性。當(dāng)創(chuàng)建 List<T> 時(shí)無需指定初始長(zhǎng)度,當(dāng)添加元素到 List<T> 中時(shí),也無需關(guān)心數(shù)組大小的調(diào)整(resize)問題。
1 List<int> powersOf2 = new List<int>();2 3 powersOf2.Add(1);4 powersOf2.Add(2);5 6 powersOf2[1] = 10;7 8 int sum = powersOf2[1] + powersOf2[2];
List<T> 的漸進(jìn)運(yùn)行時(shí)(Asymptotic Running Time)復(fù)雜度與 Array 是相同的。
Queue<T>
當(dāng)我們需要使用先進(jìn)先出順序(FIFO)的數(shù)據(jù)結(jié)構(gòu)時(shí),.NET 為我們提供了 Queue<T>。Queue<T> 類提供了 Enqueue 和 Dequeue 方法來實(shí)現(xiàn)對(duì) Queue<T> 的存取。
Queue<T> 內(nèi)部建立了一個(gè)存放 T 對(duì)象的環(huán)形數(shù)組,并通過 head 和 tail 變量來指向該數(shù)組的頭和尾。
默認(rèn)情況下,Queue<T> 的初始化容量是 32,也可以通過構(gòu)造函數(shù)指定容量。
Enqueue 方法會(huì)判斷 Queue<T> 中是否有足夠容量存放新元素。如果有,則直接添加元素,并使索引 tail 遞增。在這里的 tail 使用求模操作以保證 tail 不會(huì)超過數(shù)組長(zhǎng)度。如果容量不夠,則 Queue<T> 根據(jù)特定的增長(zhǎng)因子擴(kuò)充數(shù)組容量。
默認(rèn)情況下,增長(zhǎng)因子(growth factor)的值為 2.0,所以內(nèi)部數(shù)組的長(zhǎng)度會(huì)增加一倍。也可以通過構(gòu)造函數(shù)中指定增長(zhǎng)因子。Queue<T> 的容量也可以通過 TrimExcess 方法來減少。
Dequeue 方法根據(jù) head 索引返回當(dāng)前元素,之后將 head 索引指向 null,再遞增 head 的值。
Stack<T>
當(dāng)需要使用后進(jìn)先出順序(LIFO)的數(shù)據(jù)結(jié)構(gòu)時(shí),.NET 為我們提供了 Stack<T>。Stack<T> 類提供了 Push 和 Pop 方法來實(shí)現(xiàn)對(duì) Stack<T> 的存取。
Stack<T> 中存儲(chǔ)的元素可以通過一個(gè)垂直的集合來形象的表示。當(dāng)新的元素壓入棧中(Push)時(shí),新元素被放到所有其他元素的頂端。當(dāng)需要彈出棧(Pop)時(shí),元素則被從頂端移除。
Stack<T> 的默認(rèn)容量是 10。和 Queue<T> 類似,Stack<T> 的初始容量也可以在構(gòu)造函數(shù)中指定。Stack<T> 的容量可以根據(jù)實(shí)際的使用自動(dòng)的擴(kuò)展,并且可以通過 TrimExcess 方法來減少容量。
如果 Stack<T> 中元素的數(shù)量 Count 小于其容量,則 Push 操作的復(fù)雜度為 O(1)。如果容量需要被擴(kuò)展,則 Push 操作的復(fù)雜度變?yōu)?O(n)。Pop 操作的復(fù)雜度始終為 O(1)。
Hashtable
現(xiàn)在我們要使用員工的社保號(hào)作為唯一標(biāo)識(shí)進(jìn)行存儲(chǔ)。社保號(hào)的格式為 DDD-DD-DDDD(D 的范圍為數(shù)字 0-9)。
如果使用 Array 存儲(chǔ)員工信息,要查詢社保號(hào)為 111-22-3333 的員工,則將會(huì)嘗試遍歷數(shù)組的所有選擇,即執(zhí)行復(fù)雜度為 O(n) 的查詢操作。好一些的辦法是將社保號(hào)排序,以使查詢復(fù)雜度降低到 O(log(n))。但理想情況下,我們更希望查詢復(fù)雜度為 O(1)。
一種方案是建立一個(gè)大數(shù)組,范圍從 000-00-0000 到 999-99-9999 。
這種方案的缺點(diǎn)是浪費(fèi)空間。如果我們僅需要存儲(chǔ) 1000 個(gè)員工的信息,那么僅利用了 0.0001% 的空間。
第二種方案就是用哈希函數(shù)(Hash Function)壓縮序列。
我們選擇使用社保號(hào)的后四位作為索引,以減少區(qū)間的跨度。這樣范圍將從 0000 到 9999。
在數(shù)學(xué)上,將這種從 9 位數(shù)轉(zhuǎn)換為 4 位數(shù)的方式稱為哈希轉(zhuǎn)換(Hashing)??梢詫⒁粋€(gè)數(shù)組的索引空間(indexers space)壓縮至相應(yīng)的哈希表(Hash Table)。
在上面的例子中,哈希函數(shù)的輸入為 9 位數(shù)的社保號(hào),輸出結(jié)果為后 4 位。
H(x) = last four digits of x
上圖中也說明在哈希函數(shù)計(jì)算中常見的一種行為:哈希沖突(Hash Collisions)。即有可能兩個(gè)社保號(hào)的后 4 位均為 0000。
當(dāng)要添加新元素到 Hashtable 中時(shí),哈希沖突是導(dǎo)致操作被破壞的一個(gè)因素。如果沒有沖突發(fā)生,則元素被成功插入。如果發(fā)生了沖突,則需要判斷沖突的原因。因此,哈希沖突提高了操作的代價(jià),Hashtable 的設(shè)計(jì)目標(biāo)就是要盡可能減低沖突的發(fā)生。
避免哈希沖突的一個(gè)方法就是選擇合適的哈希函數(shù)。哈希函數(shù)中的沖突發(fā)生的幾率與數(shù)據(jù)的分布有關(guān)。例如,如果社保號(hào)的后 4 位是隨即分布的,則使用后 4 位數(shù)字比較合適。但如果后 4 位是以員工的出生年份來分配的,則顯然出生年份不是均勻分布的,則選擇后 4 位會(huì)造成大量的沖突。
我們將選擇合適的哈希函數(shù)的方法稱為沖突避免機(jī)制(Collision Avoidance)。
在處理沖突時(shí),有很多策略可以實(shí)施,這些策略稱為沖突解決機(jī)制(Collision Resolution)。其中一種方法就是將要插入的元素放到另外一個(gè)塊空間中,因?yàn)橄嗤墓N恢靡呀?jīng)被占用。
例如,最簡(jiǎn)單的一種實(shí)現(xiàn)就是線性挖掘(Linear Probing),步驟如下:
當(dāng)插入新的元素時(shí),使用哈希函數(shù)在哈希表中定位元素位置;
檢查哈希表中該位置是否已經(jīng)存在元素。如果該位置內(nèi)容為空,則插入并返回,否則轉(zhuǎn)向步驟 3。
如果該位置為 i,則檢查 i+1 是否為空,如果已被占用,則檢查 i+2,依此類推,直到找到一個(gè)內(nèi)容為空的位置。
現(xiàn)在如果我們要將五個(gè)員工的信息插入到哈希表中:
Alice (333-33-1234)
Bob (444-44-1234)
Cal (555-55-1237)
Danny (000-00-1235)
Edward (111-00-1235)
則插入后的哈希表可能如下:
元素的插入過程:
Alice 的社保號(hào)被哈希為 1234,因此存放在位置 1234。
Bob 的社保號(hào)被哈希為 1234,但由于位置 1234 處已經(jīng)存放 Alice 的信息,則檢查下一個(gè)位置 1235,1235 為空,則 Bob 的信息就被放到 1235。
Cal 的社保號(hào)被哈希為 1237,1237 位置為空,所以 Cal 就放到 1237 處。
Danny 的社保號(hào)被哈希為 1235,1235 已被占用,則檢查 1236 位置是否為空,1236 為空,所以 Danny 就被放到 1236。
Edward 的社保號(hào)被哈希為 1235,1235 已被占用,檢查1236,也被占用,再檢查1237,直到檢查到 1238時(shí),該位置為空,于是 Edward 被放到了1238 位置。
線性挖掘(Linear Probing)方式雖然簡(jiǎn)單,但并不是解決沖突的最好的策略,因?yàn)樗鼤?huì)導(dǎo)致同類哈希的聚集。這導(dǎo)致搜索哈希表時(shí),沖突依然存在。例如上面例子中的哈希表,如果我們要訪問 Edward 的信息,因?yàn)?Edward 的社保號(hào) 111-00-1235 哈希為 1235,然而我們?cè)?1235 位置找到的是 Bob,所以再搜索 1236,找到的卻是 Danny,以此類推直到找到 Edward。
一種改進(jìn)的方式為二次挖掘(Quadratic Probing),即每次檢查位置空間的步長(zhǎng)為平方倍數(shù)。也就是說,如果位置 s 被占用,則首先檢查 s + 12 處,然后檢查s - 12,s + 22,s - 22,s + 32 依此類推,而不是象線性挖掘那樣以 s + 1,s + 2 ... 方式增長(zhǎng)。盡管如此,二次挖掘同樣也會(huì)導(dǎo)致同類哈希聚集問題。
.NET 中的 Hashtable 的實(shí)現(xiàn),要求添加元素時(shí)不僅要提供元素(Item),還要為該元素提供一個(gè)鍵(Key)。例如,Key 為員工社保號(hào),Item 為員工信息對(duì)象??梢酝ㄟ^ Key 作為索引來查找 Item。
1 Hashtable employees = new Hashtable(); 2 3 // Add some values to the Hashtable, indexed by a string key 4 employees.Add("111-22-3333", "Scott"); 5 employees.Add("222-33-4444", "Sam"); 6 employees.Add("333-44-55555", "Jisun"); 7 8 // Access a particular key 9 if (employees.ContainsKey("111-22-3333"))10 {11 string empName = (string)employees["111-22-3333"];12 Console.WriteLine("Employee 111-22-3333's name is: " + empName);13 }14 else15 Console.WriteLine("Employee 111-22-3333 is not in the hash table...");
Hashtable 類中的哈希函數(shù)比前面介紹的社保號(hào)的實(shí)現(xiàn)要更為復(fù)雜。哈希函數(shù)必須返回一個(gè)序數(shù)(Ordinal Value)。對(duì)于社保號(hào)的例子,通過截取后四位就可以實(shí)現(xiàn)。但實(shí)際上 Hashtable 類可以接受任意類型的值作為 Key,這都要?dú)w功于 GetHashCode 方法,一個(gè)定義在 System.Object 中的方法。GetHashCode 的默認(rèn)實(shí)現(xiàn)將返回一個(gè)唯一的整數(shù),并且保證在對(duì)象的生命周期內(nèi)保持不變。
Hashtable 類中的哈希函數(shù)定義如下:
H(key) = [GetHash(key) + 1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1))] % hashsize
這里的 GetHash(key) 默認(rèn)是調(diào)用 key 的 GetHashCode 方法以獲取返回的哈希值。hashsize 指的是哈希表的長(zhǎng)度。因?yàn)橐M(jìn)行求模,所以最后的結(jié)果 H(key) 的范圍在 0 至 hashsize - 1 之間。
當(dāng)在哈希表中添加或獲取一個(gè)元素時(shí),會(huì)發(fā)生哈希沖突。前面我們簡(jiǎn)單地介紹了兩種沖突解決策略:
線性挖掘(Linear Probing)
二次挖掘(Quadratic Probing)
在 Hashtable 類中則使用的是一種完全不同的技術(shù),稱為二度哈希(rehashing)(有些資料中也將其稱為雙精度哈希(double hashing))。
二度哈希的工作原理如下:
有一個(gè)包含一組哈希函數(shù) H1...Hn 的集合。當(dāng)需要從哈希表中添加或獲取元素時(shí),首先使用哈希函數(shù) H1。如果導(dǎo)致沖突,則嘗試使用 H2,以此類推,直到 Hn。所有的哈希函數(shù)都與 H1 十分相似,不同的是它們選用的乘法因子(multiplicative factor)。
通常,哈希函數(shù) Hk 的定義如下:
Hk(key) = [GetHash(key) + k * (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1)))] % hashsize
當(dāng)使用二度哈希時(shí),重要的是在執(zhí)行了 hashsize 次挖掘后,哈希表中的每一個(gè)位置都有且只有一次被訪問到。也就是說,對(duì)于給定的 key,對(duì)哈希表中的同一位置不會(huì)同時(shí)使用 Hi 和 Hj。在 Hashtable 類中使用二度哈希公式,其始終保持 (1 + (((GetHash(key) >> 5) + 1) % (hashsize – 1)) 與 hashsize 互為素?cái)?shù)(兩數(shù)互為素?cái)?shù)表示兩者沒有共同的質(zhì)因子)。
二度哈希較前面介紹的線性挖掘(Linear Probing)和二次挖掘(Quadratic Probing)提供了更好的避免沖突的策略。
Hashtable 類中包含一個(gè)私有成員變量 loadFactor,loadFactor 指定了哈希表中元素?cái)?shù)量與位置(slot)數(shù)量之間的最大比例。例如:如果 loadFactor 等于 0.5,則說明哈希表中只有一半的空間存放了元素值,其余一半都為空。
哈希表的構(gòu)造函數(shù)允許用戶指定 loadFactor 值,定義范圍為 0.1 到 1.0。然而,不管你提供的值是多少,范圍都不會(huì)超過 72%。即使你傳遞的值為 1.0,Hashtable 類的 loadFactor 值還是 0.72。微軟認(rèn)為loadFactor 的最佳值為 0.72,這平衡了速度與空間。因此雖然默認(rèn)的 loadFactor 為 1.0,但系統(tǒng)內(nèi)部卻自動(dòng)地將其改變?yōu)?0.72。所以,建議你使用缺省值1.0(但實(shí)際上是 0.72)。
向 Hashtable 中添加新元素時(shí),需要檢查以保證元素與空間大小的比例不會(huì)超過最大比例。如果超過了,哈希表空間將被擴(kuò)充。步驟如下:
哈希表的位置空間幾乎被翻倍。準(zhǔn)確地說,位置空間值從當(dāng)前的素?cái)?shù)值增加到下一個(gè)最大的素?cái)?shù)值。
因?yàn)槎裙r(shí),哈希表中的所有元素值將依賴于哈希表的位置空間值,所以表中所有值也需要重新二度哈希。
由此看出,對(duì)哈希表的擴(kuò)充將是以性能損耗為代價(jià)。因此,我們應(yīng)該預(yù)先估計(jì)哈希表中最有可能容納的元素?cái)?shù)量,在初始化哈希表時(shí)給予合適的值進(jìn)行構(gòu)造,以避免不必要的擴(kuò)充。
Dictionary<K,T>
Hashtable 類是一個(gè)類型松耦合的數(shù)據(jù)結(jié)構(gòu),開發(fā)人員可以指定任意的類型作為 Key 或 Item。當(dāng) .NET 引入泛型支持后,類型安全的 Dictionary<K,T> 類出現(xiàn)。Dictionary<K,T> 使用強(qiáng)類型來限制 Key 和 Item,當(dāng)創(chuàng)建 Dictionary<K,T> 實(shí)例時(shí),必須指定 Key 和 Item 的類型。
Dictionary<keyType, valueType> variableName = new Dictionary<keyType, valueType>();
如果繼續(xù)使用上面描述的社保號(hào)和員工的示例,我們可以創(chuàng)建一個(gè) Dictionary<K,T> 的實(shí)例:
Dictionary<int, Employee> employeeData = new Dictionary<int, Employee>();
這樣我們就可以添加和刪除員工信息了。
1 // Add some employees2 employeeData.Add(455110189) = new Employee("Scott Mitchell");3 employeeData.Add(455110191) = new Employee("Jisun Lee");4 5 // See if employee with SSN 123-45-6789 works here6 if (employeeData.ContainsKey(123456789))
Dictionary<K,T> 與 Hashtable 的不同之處還不止一處。除了支持強(qiáng)類型外,Dictionary<K,T> 還采用了不同的沖突解決策略(Collision Resolution Strategy),這種新的技術(shù)稱為鏈技術(shù)(chaining)。
前面使用的挖掘技術(shù)(probing),如果發(fā)生沖突,則將嘗試列表中的下一個(gè)位置。如果使用二度哈希(rehashing),則將導(dǎo)致所有的哈希被重新計(jì)算。而新的鏈技術(shù)(chaining)將采用額外的數(shù)據(jù)結(jié)構(gòu)來處理沖突。Dictionary<K,T> 中的每個(gè)位置(slot)都映射到了一個(gè)數(shù)組。當(dāng)沖突發(fā)生時(shí),沖突的元素將被添加到桶(bucket)列表中。
下面的示意圖中描述了 Dictionary<K,T> 中的每個(gè)桶(bucket)都包含了一個(gè)鏈表以存儲(chǔ)相同哈希的元素。
上圖中,該 Dictionary 包含了 8 個(gè)桶,也就是自頂向下的黃色背景的位置。一定數(shù)量的 Employee 對(duì)象已經(jīng)被添加至 Dictionary 中。如果一個(gè)新的 Employee 要被添加至 Dictionary 中,將會(huì)被添加至其 Key 的哈希所對(duì)應(yīng)的桶中。如果在相同位置已經(jīng)有一個(gè) Employee 存在了,則將會(huì)將新元素添加到列表的前面。
向 Dictionary 中添加元素的操作涉及到哈希計(jì)算和鏈表操作,但其仍為常量,復(fù)雜度為 O(1)。
對(duì) Dictionary 進(jìn)行查詢和刪除操作時(shí),其平均時(shí)間取決于 Dictionary 中元素的數(shù)量和桶(bucket)的數(shù)量。具體的說就是運(yùn)行時(shí)間為 O(n/m),這里 n 為元素的總數(shù)量,m 是桶的數(shù)量。但 Dictionary 幾乎總是被實(shí)現(xiàn)為 n = m,也就是說,元素的總數(shù)絕不會(huì)超過桶的總數(shù)。所以 O(n/m) 也變成了常量 O(1)。
到此,關(guān)于“web常用數(shù)據(jù)結(jié)構(gòu)及復(fù)雜度實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
新聞名稱:web常用數(shù)據(jù)結(jié)構(gòu)及復(fù)雜度實(shí)例分析
文章位置:http://bm7419.com/article28/jcesjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站設(shè)計(jì)、服務(wù)器托管、動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)