【问题标题】:Datastructure ambiguity数据结构歧义
【发布时间】:2011-05-02 12:32:37
【问题描述】:

我想不出这个面试问题。

你有一个整数数组。您需要提供另一个具有这些功能的数据结构:

int get(int index)
void set (int index, int value)
void setall(int value)

他们都会做你猜他们应该做的事。 限制是每个函数都在 O(1) 中。

你如何设计它以使 setAll 为 O(1)。

我考虑为每个整数添加另一个字段,该字段将指向一个整数,每次调用 setAll 时都会更改该整数。当有人调用 setAll 然后 set 然后 get 时问题就来了。

编辑:我更改了变量的名称,这样会更清楚。另外,既然你问了,get 假设返回 array[i],set(index, value) 假设将 value value 放入 array[index]。

setall(index, value) 之后,您应该为数组中的每个 i,j 使用 get (get(i) == get(j) == value)

【问题讨论】:

  • setsetall 中的 i 是什么?
  • 我假设 n = 数组的长度,其中效率为 O(n)?
  • 如果有人调用setAll,然后set,然后get,为什么会有问题? (按这个顺序,表面上)另外,感觉这是一个家庭作业问题,而不是属于interview questions部分的问题。
  • 这是面试题吗?你申请的是什么职位?它似乎比其他面试问题更难更高级。我应该知道并发性、时间戳等吗?因为我一个都不认识!

标签: algorithm complexity-theory


【解决方案1】:

如何为每个变量存储一个“版本号”,即

 int globalValue, globalVersion;
 int nextVersion;
 int[] localValue, localVersion;

 int get(int i) {
     if (localVersion[i] > globalVersion)
         return localValue[i];
     else
         return globalValue;
 }


 void set(int i, int value) {
     localValue[i] = value;
     localVersion[i] = nextVersion++;
 }

 void setAll(int value) {
     globalValue = value;
     globalVersion = nextVersion++;
 }

【讨论】:

  • @Eyal:根据更新次数,不要忘记处理版本循环(无符号返回0,有符号变为负)。
  • 问题是 set(i) 而不是 set(i,value) :-)
  • 您可以通过使用纪元时间的时间戳将两个答案组合到纳秒精度,因为没有 2 个命令将在同一纳秒完成。这基本上只是一个简单的MVCC
  • @Moron:我假设那是一个错字。
  • @hammar:你为什么不假设setAll(i) 也是setAll(i,newvalue)(将所有与 location[i] 相同的值替换为 newvalue)? :-)
【解决方案2】:

为数组中的每个元素、setAllValue 变量和 setAllDateTime 变量保留一个 DateTime 字段(或简称为计数器)。对于每个集合,更新元素的日期时间/计数器。使用 SetAll,更新 setAllDateTime 的值和 DateTime。

在get中,比较SetAll的DateTime和元素的DateTime,以较新的为准,返回。

【讨论】:

  • @Hammar 使用版本号的解决方案可能更好。时间戳的问题是您依赖于没有两个具有相同时间戳的更改。这绝对取决于更改的频率和时间戳的分辨率。例如,Windows 以其低准确性而闻名。
  • @Matthieu @Hammer 我认为总的来说,您可以选择对您最有帮助的答案,因为您提出了问题,并且您正在寻找特定的东西。在这种情况下,Hammer 确实给出了一个非常好的解决方案,一个完整的答案,我同意。但我需要的只是 Sanrag Sood 所说的。只是想法 :) 同样,这并不是说 Hammer 的回答不好 :) 这很棒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多