当前位置: 首页 > 知识库问答 >
问题:

推送、弹出、恒定时间范围

司马辉
2023-03-14

我在一次采访中被问到:

设计一种数据结构,允许所有这些操作在恒定时间内进行

  • 推动一个元素
  • 弹出一个元素
  • 元素范围:查找当前元素的最小间隔范围
    例如,[1,22,44,56,99,98,56]的范围是98

我使用带有两个变量的自定义堆栈来设计它,max和min,但在弹出min或max元素后,这不起作用。

我尝试的内容:

我使用了一个包含两个额外变量max和min的堆栈:

DS 
{
 top, //Top of the Stack 
 min, //Min till now
 max  //Max till now
}

Push(DS, elem)
  Push_Stack(DS.top, elem)
  if elem < DS.min
    DS.min = elem
  if elem > DS.max
    DS.max = elem

Range(DS)
 return DS.max - DS.min

Pop(DS)
  x = Pop_Stack(DS.top)
  if (x == DS.min)
    DS.min = Find_New_Min(DS.top) //This takes linear time using this approach
  if (x == DS.max)
    DS.max = Find_New_Max(DS.top)

共有2个答案

穆飞龙
2023-03-14

这类似于Bryon Lo的回答,但在他发布之前,我也发表了同样的评论

维护3个堆栈

  • S1您的最终堆栈
  • S2和S3临时堆栈

Rest是不言而喻的

  push(T value)
  {
    if (value <= min()) 
    {
        s2.push(value);
    }

    if(value >= max())
    {
        s3.push(value);
    }
    s1.push(value);
  }

 T pop() 
 {
    T value = s1.pop();
    if (value == min()) 
    {
        s2.pop();
    }
    return value;
  }

  T min() 
  {
    if (s2.isEmpty()) 
    {
        return MAX_VALUE;
    } 
    else {
        return s2.peek();
    }
  }

   T max() 
  {
    if (s3.isEmpty()) 
    {
        return MIN_VALUE;
    } 
    else 
    {
        return s3.peek();
    }
  }
司空胤
2023-03-14

实现一个包含范围函数并在内部使用三个堆栈的“堆栈”。

第一个内部堆栈将表示被推送和弹出的“真实”堆栈。

只有当新元素大于或等于其顶部的元素时,才会将第二个内部堆栈推入。

只有当新元素小于或等于其顶部的元素时,才会推送到第三个内部堆栈。

现在,当你需要计算范围时,只需看一下第二和第三个堆栈的顶部,然后做一些简单的数学运算。

每当需要从“真实”堆栈中弹出一个元素时,请检查该元素是否也在其他两个堆栈的顶部,如果是,也将其从这些堆栈中弹出。

因为你必须以相反的顺序从主堆栈中弹出项目,你永远不会错过其他两个堆栈中的任何东西。。。这意味着第二个和第三个内部堆栈的顶部始终是最大值和最小值。

 类似资料:
  • 我正在根据以下要求开发JMeter脚本 Http请求总数-24,Http请求总数/分钟-12,测试持续时间2min,每分钟请求之间的等待时间:60min/12req=5秒。 在我的场景中总共发生了3笔交易 添加文档(占总请求的20%) 添加文档(占总请求的80%) 更新文档(占总请求的100%) 下面是我使用过的线程组和控制器 > 终极线程组终极线程组 (2) 吞吐量控制器分配负载的百分比[24个

  • 问题内容: 我有一个超过15000行的数据框对象,例如: 我试图找到具有特定anime_id的行。 我只是想知道此搜索是在固定时间(如字典)还是线性时间(如列表)中完成的。 问题答案: 这是一个非常有趣的问题! 我认为这取决于以下几个方面: 按索引访问单行( 索引已排序且唯一 )应具有运行时,其中 按索引访问单行( 索引不是唯一的并且未排序 )应该具有运行时 通过索引访问单行( 索引不是唯一的,并

  • 嗨,伙计们,我需要一个关于堆栈的小帮助。Pop()函数。我知道堆栈可以一个接一个地弹出元素,但是我需要不止一个元素才能弹出。例如,我在堆栈中有5个元素(4,3,2,1,0),现在我想弹出前3个或2个元素,直到堆栈索引达到1或2。现在我有“for”循环,它不能正常工作: 有人能帮我吗,让他弹出一定范围的元素?谢谢!

  • 我和我的朋友,我们正在制作某种项目,我们将GIT用于我们的版本控制软件,但是在我从gitlab中提取他的代码,并进行了一些更改并提交了这些更改后,我想推回gitlab,但是当那时,这个警告和错误: 有什么办法吗?我试图通过f旗(强制)推动回购,但仍然不起作用。。。

  • 问题内容: 我有一个表单,用户需要输入日期和时间(2个不同的字段),并且时间不能超过12小时。因此,当时间超过12小时时,我想添加一条警告消息(很可能是弹出警报)。我正在使用JSF和Java。请帮帮我! 问题答案:

  • 我需要在一定的时间范围内进行查询, 首先,我想做一个查询,比如 结果是 有人能指出我做错了什么吗? 第二,我没有做这个例子https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-daterange-aggregation.html 上面的例子如何适合我的应用,谢谢 杰夫 此