构造O(1)复杂度数组

在这里插入图片描述

最近碰到的一道比较有趣的面试题: 构造O(1)复杂度数组,题目要求如下

设计一个特殊的数组,要求该数据结构以下三种操作的时间复杂度均为O(1)

  1. 查询数组某个位置的元素
  2. 将数组某个位置的元素修改为指定值
  3. 将数组所有元素修改为指定值

这道题的困难之处在于,如何将第三个操作的复杂度降为O(1),正常来说修改所有元素的值要将操作二进行N次,如果操作二复杂度是O(1),操作三必然是O(N)。

最先想到的办法是用数组开头的第一个元素作为所有元素的代表,修改第一个元素代表着修改了所有元素,如果元素不统一,就将第一个元素置为特殊值。

但随之引发的问题是,修改了所有元素为x之后,修改其他的某个元素为y,此时再查询第三个元素,期望的结果是得到之前将其修改为的x,实际结果只能得到其修改前的值,因此这种想法不成立。

最终的解决办法是这样的:

我们依然将数组开头的第一个元素作为所有元素的代表,同时,我们维护另一个等长的数组与这个数组一一对应,存放每个元素所处的层级(最近一次操作的时间),或者使用对象数组,每个对象包括元素值和层级两个变量。

举个例子,所有元素的层级初始都为0,修改某个位置的元素时,我们将其层级修改为当前最大层级+1,修改所有元素时,我们将数组第一个元素的层级修改为当前最大层级+1,每次查询时,要查询元素都和数组的第一个元素进行层级比较,输出层级比较大的元素。

这样的结果时每个操作都变成了两个O(1)操作,用额外的操作和空间提高了前两个操作的复杂度,将第三个操作复杂度降为O(1),符合题目要求。

这个想法的来源是,我们的问题是不知道对所有元素的操作和对单个元素的操作的先后顺序,当我们知道了先后顺序之后我们很容易知道应该取什么值作为输出,因此我们就定义一个变量来记录他们的操作顺序。

另外,这个想法还有一点改进,当我们进行了很多次操作之后,层级过大会超过数据类型能够存储的上限。因此,我们在最大层级为N的时候,进行一次降层。

降层操作时,将数组的每个元素都跟数组的第一个元素层级比较,判断其当前应该存储的值,进行修改,并将所有元素层级降为0,第一个元素层级降为-1。

降层是一个2N的操作,但是当最大层级为N的时候,我们必然已经进行N次修改操作,花费了2N的时间,即N次修改操作共花费了4N的时间,每个操作的时间复杂度平均为O(1)。

以上。

原文链接: https://luospaces.com/posts/%E6%9E%84%E9%80%A0o1%E5%A4%8D%E6%9D%82%E5%BA%A6%E6%95%B0%E7%BB%84

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值