在存储多种数据类型的项的同时访问数组元素的时间恒定

问题描述

相对现代的语言(如ruby / python / js等)如何在数组中存储多种数据类型,并且仍然能够在O(1)时间使用其索引访问数组中的任何元素?

据我了解,我们通过简单的数学运算来确定指向任何元素的内存地址,我们通过将索引乘以数组中每个元素的大小来做到这一点。

解决方法

首先,Ruby语言规范,Python语言规范和ECMAScript语言规范都没有为数组(或在Python中称为列表的数组)规定任何特定的实现策略。每个实现者都可以随意实现它们。

第二,将它们混在一起并没有多大意义。例如,在ECMAScript中,数组实际上只是具有数字属性的对象,而实际上,这些数字属性甚至不是真正的数字,它们是字符串。

第三,它们实际上并没有存储多种数据类型。例如。 Ruby只有一种数据类型:对象。由于所有事物都是对象,因此所有事物都具有相同的类型,因此将对象存储在数组中没有问题。

第四,至少《 Ruby语言规范》实际上并未保证数组访问为O(1)。不提供O(1)访问的Ruby实现很有可能会被社区拒绝,但不会违反任何规范。

现在,当然,任何实施者都可以像他们想要的那样聪明。例如。 V8检测何时数组的所有值都是数字,然后以不同的方式存储数组。但这是V8的内部私有实现细节。

,

在内存中,异构数组是指针数组。每个数组元素都在数组中的该位置存储该项的内存地址

由于内存地址大小都相同,因此可以通过将数组索引乘以地址大小并将其加到数组的基地址中来找到每个地址的地址。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...