Jos*_*vin 10 memory arrays algorithm complexity-theory data-structures
经典的O(1)随机访问数据结构是数组.但是数组依赖于所使用的编程语言来支持有保证的连续内存分配(因为数组依赖于能够采用基类的简单偏移来找到任何元素).
这意味着语言必须具有关于内存是否连续的语义,而不是将其作为实现细节.因此,可能需要具有O(1)随机访问但不依赖于连续存储的数据结构.
有这样的事吗?
哈希表?
编辑:数组是O(1)查找的,因为a[i]它只是 的语法糖*(a+i)。换句话说,要获取O(1),您需要一个直接指针或一个易于计算的指向每个元素的指针(以及您要查找的内存用于您的程序的良好感觉)。如果没有指向每个元素的指针,那么在没有连续内存的情况下,不可能有一个易于计算的指针(并且知道内存是为您保留的)。
当然,有一个哈希表实现是合理的(如果很糟糕的话),其中每个查找的内存地址根本不是*(a + hash(i))在数组中完成的,即如果您有这种控制权,则在指定的内存位置动态创建......重点是最有效的实现将是一个底层数组,但是在其他地方进行命中来执行 WTF 实现仍然可以让您进行恒定时间查找,这当然是合理的。
Edit2:我的观点是,数组依赖连续内存,因为它是语法糖,但哈希表选择数组是因为它是最好的实现方法,而不是因为它是必需的。当然,我一定是读了太多 DailyWTF 了,因为我想象着重载 C++ 的数组索引运算符,以同样的方式在没有连续内存的情况下完成它。