我在計算機科學課上學習數組和鏈表。我的教授說,數組不能添加或刪除元素,所以我們使用鏈表。Ruby數組是什麼數據結構?
我知道在Python,Ruby和JavaScript中的數組的實現都允許我修改所有我想要的數組長度。這些語言是否真的實現了鏈表或其他數據結構,並將其稱爲數組?
這是怎麼回事?如果它不是一個真正的數組,他們爲什麼稱它爲一個?
我在計算機科學課上學習數組和鏈表。我的教授說,數組不能添加或刪除元素,所以我們使用鏈表。Ruby數組是什麼數據結構?
我知道在Python,Ruby和JavaScript中的數組的實現都允許我修改所有我想要的數組長度。這些語言是否真的實現了鏈表或其他數據結構,並將其稱爲數組?
這是怎麼回事?如果它不是一個真正的數組,他們爲什麼稱它爲一個?
如果數組已滿,則固定大小的數組不能具有添加到元素末尾的元素,但刪除元素很好。這就是堆棧的工作原理。
內部Ruby數組被分配爲固定大小的C風格數組,並且在添加元素時自動調整大小。作爲一種優化,它們通常會重新調整大小,超出所需的範圍,以避免在每次添加時重新分配。
鏈接列表是一種不同的數據結構,允許更靈活的插入和刪除,但是遍歷速度慢得多,不允許簡單的隨機訪問,這對於數組結構非常重要。在源爲Ruby陣列實施
酷。我知道JS和Python也是C的衍生物。他們是否也使用C風格的數組? – 2014-10-07 17:24:44
它們不是C的派生物,但標準的Ruby,Python和JavaScript V8核心是用C語言編寫的。它們只是約定,它們在內部使用C風格的數組,但每種方法都有不同的方法來處理這些數據。 – tadman 2014-10-07 17:39:07
https://github.com/ruby/ruby/blob/trunk/array.c
快速一瞥,它是一個C陣列,只是一個存儲器塊。但是正如你在代碼中看到的那樣,它還提供了通過更新這塊內存或者根據需要重新分配來添加和刪除的功能,爲您提供了修改Ruby數組的動態方便。
您可以查看所有這些數組實現的代碼。你也應該警惕類似「讓你修改數組長度」這樣的陳述 - 僅僅因爲你可以使一個數組變長,並不意味着當你這樣做時不會產生內存拷貝。 – 2014-10-07 15:50:15
在Ruby和Python等高級語言中,鏈表實際上沒有用處,因爲沒有有效的方法來實現它們(至少不比內置數組類型更有效)。數組/鏈表比較你的教授大都適用於C. – Martijn 2014-10-07 18:12:27