您好,登錄后才能下訂單哦!
但凡IT江湖俠士,算法與數據結構為必修之課。早有前輩已經明確指出:程序=算法+數據結構 。要想在之后的江湖歷練中通關,數據結構必不可少。數據結構與算法相輔相成,亦是陰陽互補之法。
說道數組,幾乎每個IT江湖人士都不陌生,甚至過半人還會很自信覺的它很簡單。
的確,在菜菜所知道的編程語言中幾乎都會有數組的影子。不過它不僅僅是一種基礎的數據類型,更是一種基礎的數據結構。如果你覺的對數組足夠了解,那能不能回答一下:
所謂數組,是相同的元素序列。數組是在程序設計中,為了處理方便,把具有相同類型的若干元素按無序的形式組織起來的一種形式。
正如以上所述,數組在應用上屬于數據的容器。不過我還是要補充兩點:
有線性結構當然就有非線性結構,比如之后我們要介紹的二叉樹,圖 等等,這里不再展開~~~
我相信所有人在使用數組的時候都知道數組可以按照下標來訪問,例如 array[1] 。作為一種最基礎的數據結構是什么使數組具有這樣的隨機訪問方式呢?天性聰慧的你可能已經想到了:內存連續+相同數據類型。
現在我們抽象一下數據在內存上分配的情景。
array[n]=array[0]+size*n
以上是元素地址的運算,其中size為每個元素的大小,如果為int類型數據,那size就為4個字節。其實確切的說,n的本質是一個離首元素的偏移量,所以array[n]就是距離首元素n個偏移量的元素,因此計算array[n]的內存地址只需以上公式。
論證一下,如果下標從1開始計算,那array[n]的內存地址計算公式就會變為:
array[n]=array[0]+size*(n-1)
對比很容易發現,從1開始編號比從0開始編號每次獲取內存地址都多了一次 減法運算,也就多了一次cpu指令的運行。這也是數組從0下標開始訪問一個原因。
其實還有一種可能性,那就是所有現代編程語言的鼻祖:C語言,它是從0開始計數下標的,所以現在所有衍生出來的后代語言也就延續了這個傳統。雖然不符合人類的思想,但是符合計算機的原理。當然也有一些語言可以設置為不從下標0開始計算,這里不再展開,有興趣的可以去搜索一下。
當然這里有一個技巧:如果你的業務要求并不是數組連續有序的,當在位置k插入元素的時候,只需要把k元素轉移到數組末尾,新元素插入到k位置即可。當然仔細沉思一下這種業務場景可能性太小了,數組都可以無序,我直接插入末尾即可,沒有必要非得在k位置插入把。~~
當然還有一個特殊場景:如果是多次連續的k位置插入操作,我們完全可以合并為一次“批量插入”操作:把k之后的元素整體移動sum(插入次數)個位置,無需一個個位置移動,把三次操作的時間復雜度合并為一次。
與插入對應的就有刪除操作,同理,刪除操作數組為了保持連續性,也需要元素的移動。
綜上所述,數組在添加和刪除元素的場景下劣勢比較明顯,所以在具體業務場景下應該避免頻繁添加和刪除的操作。
我們學習的每個數據結構其實都有對應的適合場景,只不過是場景多少的問題,具體什么時候用,需要我們對該數據結構的特性做深入分析。
關于數組的特性,通過以上介紹可以知道最大的一個亮點就是按照下標訪問,那有沒有具體業務映射這種特性呢?
添加關注,查看更精美版本,收獲更多精彩
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。