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