C++ 0x正在引入unordered_set,可以在boost许多其他地方使用.我理解的是unordered_set具有O(1)查找复杂性的哈希表.另一方面,set只是具有log(n)查找复杂性的树.为什么人们会使用set而不是unordered_set?即是否需要set了?
二进制搜索树比哈希表有什么优势?
哈希表可以在Theta(1)时间查找任何元素,并且添加元素也同样容易....但我不确定反过来的优势.
我正在开发一个演示Djikstra算法的应用程序,并且要使用它,我需要在我的元素值减少时恢复堆属性.
关于复杂的问题是,当算法改变的元素的值,该元素的索引用于优先级队列中的内部结构(堆在这种情况下)是未知的.因此,我之前需要进行O(n)搜索,以便恢复索引,然后才能对其执行实际的减少键.
而且,我不确定操作所需的实际代码.我在这里使用D-Heap 作为我的优先级队列.伪代码会有所帮助,但我更喜欢Java中的一个例子,说明应该如何做.
我想知道如何在C++中实现一个集合.如果我在不使用STL提供的容器的情况下实现自己的set容器,那么最好的方法是什么呢?
我理解STL集基于二叉搜索树的抽象数据结构.那么底层数据结构是什么?数组?
另外,如何insert()为一组工作?set如何检查元素是否已经存在?
我在维基百科上读到,实现集合的另一种方法是使用哈希表.这怎么样?
你知道它有一个最大-最小堆可靠的Java实现流行的库(Apache的,谷歌等,集合)的,这是一个堆,它允许偷看其最小值和最大值O(1),并在删除一个元素O(log n)?
这是一个在求职面试中出现的问题.我们的想法是定义一个数据结构,而不是使用Java内置的LinkedHashMap.
LRU高速缓存删除最近最少使用的条目以插入新条目.因此,给出以下场景:
A - B - C - D - E
Run Code Online (Sandbox Code Playgroud)
如果A是最近最少使用的项目,如果我们要插入F,我们需要删除A.
如果我们通过(键,值)保存带有缓存条目的HashMap以及包含元素的键和使用时间的单独列表,则可以轻松实现这一点.但是,我们需要查询列表以找到最近最少使用的项目,具有潜在的O(n)时间复杂度.
如何在Java中为通用对象和O(1)操作实现此结构?
这与可能的重复不同,因为它侧重于效率(O(1)ops)和实现数据结构本身,而不是扩展Java.
Fibonacci堆和二进制堆的真实世界应用是什么?如果你可以在用它来解决问题时分享一些实例,那就太棒了.
编辑:还添加了二进制堆.很想知道.
我有一个我想用来创建堆的向量.我不确定是否应该使用C++ make_heap函数或将我的向量放在优先级队列中?在性能方面哪个更好?我何时应该使用一个与另一个?
我正在编写dijkstra算法的代码,对于我们应该找到与当前正在使用的节点的距离最小的节点的部分,我在那里使用一个数组并完全遍历它以找出节点.
这个部分可以用二进制堆代替,我们可以在O(1)时间内找出节点,但是我们还在更进一步的迭代中更新节点的距离,我将如何合并该堆?
在数组的情况下,我所要做的就是去第(ith -1)索引并更新那个节点的值,但是在二进制堆中不能做同样的事情,我将不得不做完全搜索来计算退出节点的位置,然后更新它.
这个问题的解决方法是什么?
Fibonacci堆在实践中用于任何地方吗?我环顾四周,找到了相关问题的答案(见下文),但实际上并没有回答这个问题.
algorithm ×3
c++ ×3
heap ×3
java ×2
binary-heap ×1
c++11 ×1
decrease-key ×1
dijkstra ×1
generics ×1
hashtable ×1
minmax-heap ×1
set ×1