相對現代的語言(例如 ruby/python/js 等)如何在數組中存儲多種數據類型,并且仍然能夠在 O(1) 時間內使用其索引訪問數組中的任何元素?據我了解,我們進行簡單的數學計算來確定指向任何元素的內存地址,并通過索引乘以數組每個元素的大小來確定。
2 回答

慕桂英546537
TA貢獻1848條經驗 獲得超10個贊
首先,Ruby 語言規范、Python 語言規范和 ECMAScript 語言規范都沒有規定數組(或在 Python 中稱為列表)的任何特定實現策略。每個實施者都可以自由地按照自己的意愿實施它們。
其次,把它們放在一起沒有多大意義。例如,在 ECMAScript 中,數組實際上只是具有數字屬性的對象,而實際上,這些數字屬性甚至不是真正的數字,它們是字符串。
第三,它們并不真正存儲多種數據類型。例如,Ruby 只有一種數據類型:對象。由于一切都是對象,一切都具有相同的類型,因此將對象存儲在數組中沒有問題。
第四,至少 Ruby 語言規范實際上并沒有保證數組訪問的復雜度是 O(1)。不提供 O(1) 訪問權限的 Ruby 實現很可能會被社區拒絕,但它不會違反任何規范。
當然,現在任何實施者都可以隨心所欲地發揮自己的聰明才智。例如,V8 檢測數組的所有值何時都是數字,然后以不同的方式存儲該數組。但這是 V8 的私有內部實現細節。

至尊寶的傳說
TA貢獻1789條經驗 獲得超10個贊
在內存中,異構數組是指針數組。每個數組元素都存儲數組中該位置項的內存地址。
由于內存地址的大小都相同,因此可以通過將數組索引乘以地址大小并將其與數組的基地址相加來找到每個地址的地址。
添加回答
舉報
0/150
提交
取消