数据结构中的有序和无序
數據結構中的有序和無序
文章開頭首先感謝正在學C++博主
個人最起始的迷惑
我的迷惑來自有序列表這個名詞。
在我的印象中有序的數據結構是可以保留插入順序的一種數據結構。而無序則是指在插入數據時進行了排序、去重等操作的數據結構。
正是因為這個迷惑讓我開始了對于有序和無序的思考。
以Python的list和JavaScript的Array為例來說,以下的數據是有序還是無序
# py arr = [1,3] arr.append(2) print(arr) #[1,3,2] // JavaScript let arr = [1,3]; arr.push(2); console.log(arr); // [1,3,2]下面是疑惑點
- 如果說上面的是有序的,則可以認為是下標擁有排列順序
- 如果說上面的是無序的,則可以認為是值無排列順序,所以是無序的
與正在學C++進行討論
機緣巧合下,我發現正在學C++博主發布了很多有關算法的博客,本能的覺得老哥鐵定知道,然后厚著臉皮向老哥留言了。沒想到老哥竟然回復我了,哈哈。
原討論地址,討論內容在評論區
這里對討論內容進行整理
-
Q:
對于數據結構而言, 有序和無序是指插入元素的順序還是元素的排列順序(如從小到大)
-
A:
任意給一組數,可以說這組數是有序(小到大/大到小)或無序(亂序)的,然后對這組數進行排序使得它按照一個順序排列。插入元素的順序,怎么叫有序怎么叫無序?你可以說,對于一組有序的數,把另一個單獨的數插入到這組數中使得這組數依舊有序。
-
Q:
或許是考慮的角度問題,我下面舉一個具體一點例子:
有序鏈表,此處的有序為元素有排列順序, 但是有序鏈表其實是一個無序的數據結構。
數據結構的有序無序是以插入元素的順序來看的。
如果在插入元素時 如同set數據結構一樣進行了去重, 或者進行了排序打亂了插入的元素, 則認為該數據結構是無序的。
如同python的list一樣,很多人的介紹是一個有序可變的序列
-
A:
我學習的嚴蔚敏老師的數據結構中,有序就是指一組數,按某個關鍵字有序排列,就是有序。
可以有重復值,可以插入,可以刪除,但是有序無序與這些操作沒關系。
有序無序,指的是整體的元素關鍵字是否按照某個順序。
你說的有序鏈表,我理解的意思是,一組數的邏輯結構是線性的,物理結構是鏈式存儲。我沒有懂你說的“有序為元素有排列順序, 但是有序鏈表其實是一個無序的數據結構”。
數據元素相互之間的關系,存在著四種邏輯結構和四種物理結構。你說的是什么數據結構?
還有,有序無序是以插入元素的順序來看的,我不懂,可以插入在末尾、在中間在任何一個位置,怎么判斷有序無序?
(個人補充:當我看到可以插入在末尾、在中間在任何一個位置的時候又蒙了,隨后看到了老哥在問答中的回答后就明白了)
-
Q:
講的很透徹,我大概明白所謂的有序和無序應該站在從什么角度去理解了。謝謝您。
下方為正在學C++老哥在問答上的回答,原文地址
-
Q:
數據結構中的有序和無序是如何理解的?
以JavaScript為例
let arr = [1,3]; arr.push(2); console.log(arr); //[1,3,2]上方的數組是一個有序的還是無序的呢?
如果是有序的則可以理解為是以插入順序來看的;
如果是無序的則可以理解為是以值的排序順序來看的;
目前在看數據結構, 看到有序鏈表這一塊有點懵, 感覺有序和無序的定義很模糊.
-
A:
這一般來說是無序的。
排序,是將一個數據元素(或記錄)的任意序列,重新排列成一個按關鍵字有序的序列。
如果你的關鍵字是元素的大小,就是無序的。
如果你為每個元素增加一個屬性:位置,1的位置是1,3的位置是2,2的位置是3,且關鍵字是每個元素的位置,那就是有序。
總結
判斷有序和無序需要辯證地來說。
以上面的例子來說:
let arr = [1,3]; arr.push(2); console.log(arr); //[1,3,2]如果站在值的角度來說這個數組為無序的,因為它沒有對數據進行排序,數據依然是以亂序排列的
如果站在數組本身的實現邏輯的角度來說,它是有序的,因為可以按照索引進行取值,并且索引是有序的
有序集合:集合里的元素可以根據key或index訪問
無序集合:集合里的元素只能遍歷。
編程是一個不斷試錯的過程,在這個過程中感謝每一個幫助過我的人,每一個把自己的理解和學習心得無私分享出來人。
如果文章中有不對的地方請您在評論區指出來,我會及時改正。
文章的末尾再次感謝正在學C++博主。
總結
以上是生活随笔為你收集整理的数据结构中的有序和无序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《大道至简》的幕后故事(3):“愚公移山
- 下一篇: 一款开源的指纹识别SDK