Tag: 数据结构

什么是一个有效的algorithm来找出一个单链表是否是循环的/循环的?

我怎样才能find一个单链表是循环/循环的? 我试图search,但找不到一个令人满意的解决scheme。 如果可能的话,你能提供一个伪代码还是Java实现? 例如: 1 → 3 → 5 → 71 → 45 → 7 → 5 ,其中第二个5实际上是列表的第三个元素。

如何实现一个数组的3个堆栈?

有时,我遇到以下面试问题:如何实现一个数组的3个堆栈? 当然,任何静态分配都不是解决scheme。

自然数如何表示提供恒定的时间加法?

对于一个基本上不相关的问题, Cirdec的答案让我想知道如何用恒定的时间加法表示自然数,减去一个数,然后testing零。 为什么皮亚诺算术不够好: 假设我们使用 data Nat = Z | S Nat 那我们可以写 Z + n = n S m + n = S(m+n) 我们可以在O(1)时间内计算m+n ,通过放置mr借记(对于某个常量r ),每个S构造函数添加一个到n 。 为了得到O(1) isZero ,我们需要确保每S构造函数至多有p isZero ,对于一些常量p 。 如果我们计算a + (b + (c+…)) ,这个效果很好,但是如果我们计算((…+b)+c)+d ,它会分解。 麻烦的是,借方在前端堆积起来。 一个选项 简单的解决方法就是直接使用Okasaki描述的可链接列表。 有两个问题: O(n)空间不是很理想。 至less对我而言,并不是完全清楚的是,当我们不关心按照列表的方式排列时,引导队列的复杂性是必要的。

为什么散列表扩展通常是通过加倍大小来完成的?

我已经做了一些关于散列表的研究,并且按照经验法则运行,当有一定数量的条目时(无论是最大值还是通过75%的加载因子),散列表都应该被扩展。 几乎总是build议将散列表的大小加倍(或加1,即2n + 1)。 但是,我一直没有find一个很好的理由。 为什么要扩大一倍,而不是增加25%,或者增加到下一个素数或下一个素数(如三个)的大小? 我已经知道,select一个初始哈希表大小是一个好主意,至less如果你的哈希函数使用通用哈希等模数。 而且我知道这就是为什么通常build议做2n + 1而不是2n(例如http://www.concentric.net/~Ttwang/tech/hashsize.htm ) 然而,正如我所说,我还没有看到任何真正的解释,为什么加倍或加一加实际上是一个不错的select,而不是其他一些方法为新的散列表select一个大小。 (是的,我读过哈希表维基百科的文章:) http://en.wikipedia.org/wiki/Hash_table

Trie与后缀树与后缀数组

哪个结构提供了最佳的性能结果; trie(前缀树),后缀树还是后缀数组? 还有其他类似的结构吗? 什么是这些结构的好的Java实现? 编辑:在这种情况下,我想进行string匹配一个大的名称字典和大量的自然语言文本之间,以便确定文本字典的名称。

如何删除堆数据结构?

我知道如何从最大堆中删除根节点,但是是从中间删除一个节点以删除并重复replace根,直到删除所需节点的过程? O(log n)是这个过程的最佳复杂度吗? 这是否会影响大O复杂性,因为必须删除其他节点才能删除特定节点?

哨兵节点如何提供优于NULL的好处?

在Sentinel Node维基百科页面上,它指出了一个超过NULL的哨兵节点的好处是: 运营速度加快 减lessalgorithm代码大小 增加了数据结构的鲁棒性(可以说)。 我真的不明白如何对前哨节点的检查会更快(或如何正确地实现它们在一个链表或树),所以我想这是更多的两个部分的问题: 什么导致哨兵节点比NULL更好的devise? 你将如何实现(例如)列表中的哨兵节点?

不可变的数据结构性能

我不明白如何能够作为一个集合是不可改变的,仍然有一个可以接受的性能。 从我读过的F#集内部使用红黑树作为他们的实现。 如果每次我们要为红黑树添加新的东西,我们必须基本上重新创build它,怎么会有好的performance? 我在这里错过了什么? 虽然我问这个F#的集合,我认为这是任何其他语言具有或使用不变的数据结构相关。 谢谢

什么是“堆栈alignment”?

什么是堆栈alignment? 为什么使用? 它可以通过编译器设置来控制吗? 这个问题的细节是从尝试使用msfc使用ffmpeg库时面临的一个问题,但是我真正感兴趣的是解释什么是“堆栈alignment”。 细节: 当运行我的msvc complied程序链接到avcodec我得到以下错误:“编译器没有alignment堆栈variables。libavcodec已被编译错误”,其次是在avcodec.dll崩溃。 avcodec.dll没有编译与msvc,所以我无法看到里面发生了什么。 当运行ffmpeg.exe和使用相同的avcodec.dll一切正常。 ffmpeg.exe没有用msvc编译,它被编译为gcc / mingw(与avcodec.dll相同) 谢谢, 担

OpenCV / SURF如何从描述符中生成图像哈希/指纹/签名?

这里有一些话题对于如何find类似的图片非常有帮助。 我想要做的是获得一张图片的指纹,并find数码相机拍摄的不同照片上的相同图片。 SURFalgorithm接缝是在缩放,angular度和其他失真方面独立的最佳方式。 我使用OpenCV和SURFalgorithm来提取样本图像上的特征。 现在我想知道如何将所有这些特征数据(位置,拉普拉斯,大小,方向,粗麻布)转换成指纹或散列。 该指纹将被存储在数据库中,并且search查询必须能够将该指纹与具有几乎相同特征的照片的指纹进行比较。 更新: 似乎没有办法将所有的描述符向量转换成简单的哈希。 那么将图像描述符存储到数据库中进行快速查询的最佳方法是什么? 词汇树会成为一个select吗? 我会非常感谢任何帮助。