使用2个堆栈在O(1)中执行extractMin操作
extractMin operation in O(1) using 2 stacks
给定一个连续的整数流和两个堆栈。我想实现extractMin操作,它在O(1)复杂度下运行。此操作从记录中弹出最小元素并返回。基本解决方案是使用2个堆栈将数据按反向排序。通过这种方式,我们可以简单地弹出包含数据的堆栈的顶部元素。但这样一来,每个整数的插入都是O(N)。我可以在插入中获得更好的复杂性吗,保持extractMin操作为O(1)。
添加示例使其更加清晰:
10,-20,2,-3,-5,10,20(任何时刻的整数流)。
extractMin() // returns -20
extractMin() // returns -5
使用堆栈无法获得更好的复杂性。即使你要求使用堆栈进行持续提取,这个问题的措辞似乎并没有明确禁止使用其他数据结构。
在我的回答的早期版本中,我建议使用min-heap,它在堆的构建过程中平均具有常量插入(在最坏的情况下,单个插入是对数的)。然而,堆不允许常量提取,而只允许对数提取。
要获得多个值的常量提取,需要对所有值进行排序。在比堆栈更复杂的情况下实现这一点的一种方法是建立一个二进制搜索树,同时跟踪最小的节点。使用平衡bst,可以实现对数插入。要获得恒定的单独提取,还需要在每个节点中存储一个父指针。但是,如果您只需要按顺序遍历所有值,那么就不需要指针。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 将执行、作业和WinAPI相乘
- 对字符数组中的元素执行逐位操作
- 为什么g++在未执行的代码处标记强制转换错误
- 使用2个堆栈在O(1)中执行extractMin操作