Questions tagged «data-structures»

有关存储数据的方式的问题,以便可以通过算法方便地使用它。

5
哈希表操作O(1)适用于哪种数据?
从(何时)的答案是哈希表查找O(1)?,我收集到,当数据满足某些统计条件时,哈希表具有最坏情况的行为,至少已摊销,并且有一些技术可以使这些条件变宽。O(1)O(1)O(1) 但是,从程序员的角度来看,我事先并不知道我的数据是什么:它通常来自某些外部来源。而且我很少一次拥有所有数据:插入和删除的发生率经常不低于查找率,因此需要对数据进行预处理以微调哈希函数。 因此,迈出一步:在掌握了有关数据源的一些知识之后,如何确定哈希表是否有机会进行操作,以及可能在哈希函数上使用哪些技术?O(1)O(1)O(1)

3
使用NIL表示空节点的目的是什么?
在我的算法和数据结构课程中,教授,幻灯片和这本书(算法简介,第3版)都使用了这个词NIL来表示例如不存在的节点(在树中)的子代。 有一次,在一次演讲中NIL,我的同学没有说,而是null教授纠正了他,而我不明白为什么教授强调这个词。 人们为什么使用单词NIL代替null,或none或任何其他单词?是否NIL具有其他人没有的某些特定含义?有历史原因吗? 请注意,我在网络上也看到了一些地方,例如,使用单词null代替NIL,但是通常使用最后一个。

2
抽象数据结构和具体数据结构有什么区别?
我以为关联数组(即地图或字典)和哈希表是相同的概念,直到我在Wikipedia中看到 对于绑定数量很少的字典,使用关联列表(绑定的链接列表)来实现字典可能是有意义的。... 关联数组最常用的通用实现是使用哈希表:绑定数组,以及将每个可能的键映射到数组索引的哈希函数。... 字典也可以存储在二进制搜索树中或专用于特定类型键的数据结构中,例如基数树,try,Judy数组或van Emde Boas树。... 因此,我想,我的问题在于我不知道关联数组(即地图或字典)是一种抽象数据类型,而哈希表是一种具体的数据结构,并且可以使用不同的具体数据结构来实现相同的抽象数据类型。 我的问题是 抽象数据结构和具体数据结构之间有什么区别和关系? 每个示例都有哪些示例(抽象和具体的数据结构)?越多越好。 有哪些具体数据结构可用于实现哪些抽象数据结构的列表?拥有一个会很好。

2
Google Code Jam长城问题是否有更快的解决方案
考虑以下Google Code Jam回合1C问题: 中国的长城始于一条无限的线,所有位置的高度均为。000 一些部落,会根据以下参数攻击墙壁:开始日,开始强度,开始西坐标和开始东坐标。这第一次攻击发生在一天,上范围,在强度。如果中有长城的任何部分的高度,则攻击成功,并且在一天结束时,将建造长城,以使其在高度会处于高度Ñ ≤ 1000 d 小号W¯¯ é d [ w ^ ,ë ] 小号[ w ^ ,ë ] &lt; 小号[ w ^ ,ë ] &lt; 小号小号NNNN≤1000N≤1000N \le 1000DDDSSSWWWEEEDDD[W,E][W,E][W,E]SSS[W,E][W,E][W,E]&lt;S&lt;S< S[W,E][W,E][W,E]&lt;S&lt;S< SSSS(或更大,如果当天其他一些攻击以强度击中同一段)S′&gt;SS′&gt;SS' > S 每个部落在撤退之前将进行多达攻击,并且每次攻击都将根据之前的迭代来确定。每个部落都有一些,和\ delta_S来确定攻击顺序:两次攻击之间将等待\ delta_D \ ge 1天,对于每次攻击,他们将移动其攻击范围\ delta_X单位(负=西,正=东部),但范围的大小将保持不变,并且每次攻击后它们的强度也会以恒定值增加/减少。δ d δ X δ 小号δ d ≥ 1 …

2
将二叉树上色为红黑树
常见的采访问题是给出一种算法,以确定给定的二叉树是否高度平衡(AVL树定义)。 我想知道我们是否可以对红黑树做类似的事情。 给定一个任意的未着色的二叉树(具有NULL节点),是否存在一种“快速”算法,该算法可以确定我们是否可以对节点Red / Black进行着色(并查找着色),以便它们满足Red-Black树的所有属性(这个问题的定义)? 最初的想法是,我们可以删除NULL节点,然后尝试递归地验证生成的树是否可以是一棵红黑树,但这似乎没有任何用处。 我在网上做了简短的搜索,但是似乎找不到任何可以解决这个问题的文件。 我可能错过了一些简单的东西。

3
二进制最小堆中的增加键和减少键
在许多关于二进制堆的讨论中,通常仅将减小键列为最小堆的受支持操作。例如,CLR第6.1章和此Wikipedia页面。为什么通常不会为最小堆列出增加密钥?我想可以通过将增加的元素(x)迭代替换为其最小的子元素来在O(height)中做到这一点,直到其子元素都不大于x为止。 例如 IncreaseKey(int pos, int newValue) { heap[pos] = newValue; while(left(pos) &lt; heap.Length) { int smallest = left(pos); if(heap[right(pos)] &lt; heap[left(pos)]) smallest = right(pos); if(heap[pos] &lt; heap[smallest]) { swap(smallest, pos); pos= smallest; } else return; } } 以上正确吗?如果没有,为什么?如果是,为什么没有列出最小堆的增加密钥?

6
具有infima的部分排序优先级的优先级队列
我有一些优先级为复合类型的对象,并且仅部分排序。我需要按此优先级顺序选择对象(即每次产生最少的项)。但是,我宁愿选择队列是否稳定(从某种意义上说,如果存在多个最小元素,则应该首先返回最旧的元素),而不是随意完成订单。 是否有任何可用于部分排序的堆数据结构?还是修改了常规优先级队列才能使用它?我需要的算法的常见选择是简单的二进制或四进制堆,但这不适用于部分排序。 优先级值支持: 一个≼ b b ≼ 一个≼≼\preccurlyeqa≼ba≼ba \preccurlyeq bb≼ab≼ab \preccurlyeq a也可能为假。在这种情况下,我写。a⋚̸ba⋚̸ba \not\lesseqgtr b 查找INFI(glb)和uprema(lub)。是最大y,因此y \ preccurlyeq x_i。计算n个值的最小值需要O(n)时间。ý ý ≼ X 我 Ñ ø (Ñ )inf(xi)inf(xi)\inf(x_i)yyyy≼xiy≼xiy \preccurlyeq x_innnO(n)O(n)O(n)下确界(并确)每一组的存在。 可以定义部分排序的线性扩展。将其用于优先级队列是一种简便的方法,因为该算法确实可以正常工作。但是顺序会影响性能,插入顺序看起来应该最好,以避免最坏的情况。 另外,我要在其中使用的算法需要知道队列中所有优先级的最小值。 优先级具有现实意义,但可能会发生变化,因此依靠它们可能拥有的其他属性似乎并不可行。 注意:二进制堆不适用于部分排序。假设一个带有aaa,bbb和c的二进制堆ccc,其中a≼ca≼ca \preccurlyeq c和a⋚̸ba⋚̸ba \not\lesseqgtr b以及a⋚̸ca⋚̸ca \not\lesseqgtr c。它们按该顺序放置,所以 a (0) / \ b (1) c (2) 现在已插入d。下一个自由头寸是3,b的左孩子bbb,所以我们得到 a (0) / …

2
如何实现AO *算法?
我注意到在实现搜索算法时会使用不同的数据结构。例如,我们使用队列来实现广度优先搜索,使用堆栈来实现深度优先搜索,使用最小堆来实现A *算法。在这些情况下,我们不需要显式构造搜索树。 但是我找不到简单的数据结构来模拟AO *算法的搜索过程。我想知道是否显式构造搜索树是实现AO *算法的唯一方法?谁能为我提供有效的实施方案?

2
证明二元堆具有
我想证明一个二元堆与nnn节点正好有假设以下列方式构建堆,那么将保留 2片叶子:⌈n2⌉⌈n2⌉\left\lceil \frac{n}{2} \right\rceil 通过percolate up插入每个新节点。这意味着必须在下一个可用子节点上创建每个新节点。我的意思是,孩子们从下到上,从左到右地被填充。例如,以下堆: 0 / \ 1 2 将有已建成的顺序为:0,1,2,(这些数字仅仅是索引,他们没有给出该节点所包含的实际数据的指示。) 这有两个重要含义: 没有完全填充级别k,在级别上将不存在任何节点k+1k+1k+1kkk 因为子级是从左到右构建的,所以在级别上的节点之间不能有“空白空间” ,或者类似以下情况: k+1k+1k+1 0 / \ 1 2 / \ \ 3 4 6 (根据我的定义,这将是非法的堆。)因此,考虑该堆的一个好方法是堆的数组实现,其中数组的索引中不能有任何“跳转”。 因此,我认为归纳法可能是实现此目的的一种好方法……也许某些事情甚至需要处理n的奇数情况。例如,使用这样的事实进行归纳,即以这种方式构建的偶数堆必须具有一个带有偶数n的子节点的内部节点,而没有奇数n的此类节点。有想法吗?

2
点图定义一个空间分区的数据结构/概念是什么
我遇到了一个解决现实世界问题的算法,并且记得在上一堂课时,我为一些家庭作业问题做了一些非常相似的事情。 基本上,这是点的图,并且绘制的线在两个点之间是等距的。它形成了一个完美的分区,其中围绕该点的线形成了最接近该点的区域形状。这会给任何人敲钟吗?我度过了艰难的时光,谷歌搜索描述并获得结果。而且我不知道该怎么形容。希望图片有帮助。

6
如何在一个数组中实现两个堆栈?
我首先要说这不是一个作业问题。我正在阅读算法简介-著名的CLRS文字,以成为更好的程序员。我正在尝试解决本书中自己提出的问题和练习。 我试图解决锻炼; Tibial 10.1-2从第10章基本数据结构从CLRS第二版。其状态如下: 说明如何在一个数组A [1..n]中实现两个堆栈,除非两个堆栈中的元素总数为n,否则两个堆栈都不会溢出。PUSH和POP操作应在O(1)时间中运行。 到目前为止,我想出的解决方案是: 让数组A [1..n]实现两个堆栈:S1 [1..i]和S2 [i..n]。 对于PUSH-S1和PUSH-S2操作,如果堆栈“已满”,则开始将元素推入另一个堆栈(例如,当尝试将新元素推入时,如果堆栈S1已满,则将该元素推入堆栈S2,反之亦然)。 这种方法的问题是我将无法可靠地进行POP-S1或POP-S2,因为无法“记住”哪个元素属于哪个堆栈。如果堆栈的元素是(键,值)对,键是堆栈号,那么要弹出一个元素,在最坏的情况下,我必须搜索i或(ni)次-这将是O(n )(如果我在这里错了,请随时纠正我),它不是O(1)。 我已经在这个问题上花了很长时间了。我在正确的轨道上吗?有人可以给我解决该问题的可能指示吗? 通常,我应该如何“思考”这些问题?还是只有真正有才智的人才能解决这类问题?解决/解决此类问题(例如获得经验)是否可以帮助我变得更好? 我在等待启蒙。

3
如何解决动态图相关问题
我在通用stackoverflow上问了这个问题,我被引导到这里。 如果有人可以解释通常如何解决部分或完全动态图问题,那将是很好的。 例如: 当在每个实例上删除一条边时,在实例的无向加权图中的两个顶点之间找到最短路径。n(u ,v )(ü,v)(u,v)ññn 当在每个实例上移除一条边等时,找到n个实例在无向图中的连接组件数。 我最近在编程竞赛中遇到了这类问题。我在网上搜索,发现了很多有关动态图的研究论文[1,2]。我读了其中的几本书,却找不到直接的东西(聚类,稀疏化等)。很抱歉含糊。 如果有人可以提供一些指针来更好地理解这些概念,我将非常感谢。 D.Eppstein,Z.Galil,GF Italiano(1999)的动态图算法 G. Nannicini,L。Liberti(2008)在动态图上的最短路径

2
哪种方法更适合在四叉树中存储大型几何对象?
在四叉树(或八叉树)中放置几何对象时,可以通过以下几种方式放置比单个节点大的对象: 将对象的引用放置在包含该对象的每个叶子中 将对象的引用放置在完全包含对象的最深节点中 #1和#2 例如: 在此图像中,您可以将圆放置在所有四个叶节点(方法1)中,或者仅放置在根节点(方法2)中,或同时放置在两个节点中(方法3)。 为了查询四叉树,哪种方法更常见?为什么?


6
在一个间隔中找到两个数字的最大异或:我们能做得比二次更好吗?
lllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r 天真的算法只检查所有可能的对。例如在红宝石中,我们有: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j &gt; max) max = i ^ j end end end max end 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.