在存储多种数据类型的项目时访问数组元素的恒定时间
Constant time to access array element while storing items of multiple data types
ruby/python/js 等相对现代的语言如何在数组中存储多种数据类型并且仍然能够在 O(1) 时间内使用其索引访问数组中的任何元素?
据我了解,我们通过简单的数学运算来确定指向任何元素的内存地址,我们通过索引乘以数组中每个元素的大小来确定。
首先,Ruby 语言规范、Python 语言规范和 ECMAScript 语言规范都没有为数组(或在 Python 中调用的列表)规定任何特定的实现策略).每个实施者都可以按照自己的意愿自由实施。
其次,将它们混为一谈意义不大。例如,在 ECMAScript 中,数组实际上只是具有数字属性的对象,实际上,这些数字属性甚至不是真正的数字,它们是字符串。
第三,它们并没有真正存储多种数据类型。例如。 Ruby 只有一种数据类型:对象。既然一切都是对象,一切都具有相同的类型,所以将对象存储在数组中是没有问题的。
第四,至少 Ruby 语言规范实际上并不保证数组访问是 O(1)。 Ruby 不提供 O(1) 访问权限的实现很可能会被社区拒绝,但它不会违反任何规范。
现在,当然,任何实现者都可以随心所欲地聪明。例如。 V8 检测数组的所有值何时都是数字,然后以不同方式存储数组。但那是 V8 私有的内部实现细节。
在内存中,异构数组就是指针数组。每个数组元素存储数组中该位置的项目的内存地址。
由于内存地址的大小都是一样的,所以可以通过数组下标乘以地址大小,然后加上数组的基地址来找到每个地址的地址。
ruby/python/js 等相对现代的语言如何在数组中存储多种数据类型并且仍然能够在 O(1) 时间内使用其索引访问数组中的任何元素?
据我了解,我们通过简单的数学运算来确定指向任何元素的内存地址,我们通过索引乘以数组中每个元素的大小来确定。
首先,Ruby 语言规范、Python 语言规范和 ECMAScript 语言规范都没有为数组(或在 Python 中调用的列表)规定任何特定的实现策略).每个实施者都可以按照自己的意愿自由实施。
其次,将它们混为一谈意义不大。例如,在 ECMAScript 中,数组实际上只是具有数字属性的对象,实际上,这些数字属性甚至不是真正的数字,它们是字符串。
第三,它们并没有真正存储多种数据类型。例如。 Ruby 只有一种数据类型:对象。既然一切都是对象,一切都具有相同的类型,所以将对象存储在数组中是没有问题的。
第四,至少 Ruby 语言规范实际上并不保证数组访问是 O(1)。 Ruby 不提供 O(1) 访问权限的实现很可能会被社区拒绝,但它不会违反任何规范。
现在,当然,任何实现者都可以随心所欲地聪明。例如。 V8 检测数组的所有值何时都是数字,然后以不同方式存储数组。但那是 V8 私有的内部实现细节。
在内存中,异构数组就是指针数组。每个数组元素存储数组中该位置的项目的内存地址。
由于内存地址的大小都是一样的,所以可以通过数组下标乘以地址大小,然后加上数组的基地址来找到每个地址的地址。