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

在O(logn)中添加、删除和插入元素

桑鸿志
2023-03-14

我们被要求创建一个在O(logn)中最坏情况下运行的算法

该算法由3个函数组成:getmin();getmax();添加()

第一个从堆栈中弹出最小的元素,并返回它;getmax从堆栈中弹出最大的元素并返回它;在堆栈上添加put元素。

我在想一个RB树;但我意识到这很难由我自己实现(从零开始)。

还有其他树或数据结构实现起来不那么复杂,并且在O(logn)中运行?

我可以只使用基本的python操作(即仅列表,...)


共有1个答案

姬飞飙
2023-03-14

我建议来一杯Treap。在我看来,这是最容易实现的平衡二叉搜索树,因为你只需要2个基本的旋转。

要搜索给定的键值,请在二元搜索树中应用标准的二元搜索算法,忽略优先级。

要将新密钥x插入到treap中,请为x生成随机优先级y。在树中对x进行二进制搜索,并在叶子位置创建一个新节点,其中二进制搜索确定x的节点应该存在。然后,只要x不是树的根,并且优先级数大于其父z,则执行树旋转,以反转x和z之间的父子关系。

要从treap中删除节点x,如果x是树的叶子,只需将其删除。如果x有一个子z,则从树中删除x,并使z成为x的父对象的子对象(如果x没有父对象,则使z成为树的根对象)。最后,如果x有两个子对象,则按排序顺序将其在树中的位置与其直接后续子对象z的位置交换,从而产生前面的一种情况。在最后一种情况下,交换可能违反z的堆排序属性,因此可能需要执行额外的旋转来恢复此属性。

获取最小值和最大值可以通过从根向左移动以获取最小值,并向右移动以获取最大值来完成。

 类似资料:
  • 这是一个众所周知的问题的略微修改版本,但我似乎无法理解这一点。 我们得到一个大小为n的数组,它包含无序的正数序列,没有重复项。我试图找到数组中未包含的最小正数,但我无法以任何方式对数组进行排序或编辑。整个过程应该是O(nlogn)时间和O(logn)空间的复杂性。 我能想到的所有解都是多项式时间复杂度的。

  • 我试图做一个哈希表与线性探测插入。 表的大小是11,我的散列函数是,h(k)=k mod 11,我想做的是。 插入(15, c)插入(4, a)插入(26, b)删除(15)插入(5, d)插入(4, e) 这是我的解决方案,但它是不对的。 应该是这样的,有人能解释一下为什么吗?

  • 如何实现以下函数都在O(log N)中的数据结构? 插入(x)-将整数添加到集合 成员(x)-检查集合是否包含整数x 删除(x)-从集合中删除整数x deleteLessThan(x)删除所有等于或小于k的数字 我唯一能想到的就是使用某种平衡的BST来获取插入、成员和删除的O(logn)。 deleteLessthan()函数看起来像这样:找到大于k的最小元素,删除它的左子树,然后重新平衡。但是,

  • 本文向大家介绍jQuery 添加元素和删除元素的方法,包括了jQuery 添加元素和删除元素的方法的使用技巧和注意事项,需要的朋友参考一下 添加新的 HTML 内容 我们将学习用于添加新内容的四个 jQuery 方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插

  • 问题内容: 我想写这样的代码- 但是我也 尝试使用,但是我得到了相同的结果 问题答案: 解释原因 for- each循环也在内部创建的迭代器的。在遍历map时,您已经通过将值再次放入map()来修改了map的结构,这会导致这种情况。 甚至在文档中也对此做了很好的解释- 此类的所有“集合视图方法”返回的迭代器都是快速失败的:如果在创建迭代器后的任何时间对结构进行结构修改,则除了通过迭代器自己的rem

  • ADDING AND REMOVING SOFTWARE Linux 或任何操作系统中最基本的任务之一便是添加和删除软件。您经常需要安装发行版中没有附带的软件,或者删除不需要的软件,这样就不会占用硬盘空间。 有些软件安装需要依赖其他软件才能运行,有时您会发现您可以在软件包安装过程中一次性下载所需的所有软件,软件包是一组文件(通常是库和其他依赖项),您需要这些文件才能使软件成功运行。当您安装一个包时