Tag: algorithm

根据事件分组数字?

给出以下三个数字序列,我想弄清楚如何对数字进行分组以find它们之间最密切的关系。 1,2,3,4 4,3,5 2,1,3 … 我不确定我要找的algorithm是什么,但是我们可以看到一些数字与其他数字的关系更强。 这些数字一起出现两次: 1 & 2 1 & 3 2 & 3 3 & 4 一起一次: 1 & 4 2 & 4 3 & 5 4 & 5 例如,我们可以看到1, 2, & 3之间必须有一个关系1, 2, & 3因为它们至less出现两次。 你也可以说3 & 4是密切相关的,因为它们也出现两次。 然而,该algorithm可能会select[1,2,3] (超过[3,4] ),因为它是一个更大的分组(更包含)。 如果我们把最经常使用的数字放在一起,我们可以组成以下任何一个分组: [1,2,3] & [4,5] [1,2] & [3,4] & [5] [1,2] […]

algorithmdevise手册是algorithm初学者的好书吗?

我对Big-O有个很好的概念,而且我也知道一些基本的sortingalgorithm,尽pipe由于某种原因,我对它们感觉不太舒服,我一直在忘记它们。 我已经用Java,Python,C和C ++进行了4年的编程; 我一直是一个体面的程序员。 现在,我想要超越学习编程语言,开始学习algorithm。 我试过卡门等人的“algorithm导论”。 但是math对我来说太密集了(或者,可能是我对那本书的math太密集了)。 现在,我打算采用Steve Skiena的algorithmdevise手册。 你会推荐它适合我的情况吗? 如果你认为这不适合我,还有其他build议吗? 谢谢你的时间!

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

我已经做了一些关于散列表的研究,并且按照经验法则运行,当有一定数量的条目时(无论是最大值还是通过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

通过有效词将一个词转换成另一个词的algorithm

我遇到了编辑距离问题的这种变化: devise一个将源词转换为目标词的algorithm。 例如:从头到尾,在每一步中,你只需要replace一个字符,而这个字就必须是有效的。 你会得到一本字典。 这显然是编辑距离问题的一个变种,但在编辑距离,我不在乎这个单词是否有效。 那么如何添加这个要求来编辑距离。

如何解决“大师”猜谜游戏?

你将如何创build一个algorithm来解决下面的难题,“主谋”? 你的对手select了六种不同的颜色(黄色,蓝色,绿色,红色,橙色,紫色)。 你必须猜测他们select了哪一个,以什么顺序。 每次猜测之后,你的对手会告诉你有多less(但不是哪一种)你猜对的颜色是正确的颜色(“黑色”),多less(但不是哪个)是正确的颜色,但在错误的地方[ “白色”]。 游戏结束,当你猜对(4黑人,0白人)。 例如,如果你的对手select了(蓝色,绿色,橙色,红色),你猜(黄色,蓝色,绿色,红色),你会得到一个“黑色”(红色)和两个白色蓝色和绿色)。 你会得到相同的分数猜测(蓝色,橙色,红色,紫色)。 我感兴趣的是你会select什么algorithm,(可选)如何将它转换成代码(最好是Python)。 我感兴趣的编码解决scheme是: 清楚(容易理解) 简洁 高效(快速猜测) 有效(解决谜题的最less数量的猜测) 灵活(可以轻松回答有关algorithm的问题,例如,最糟糕的情况是什么?) 一般(可以很容易地适应其他types的难题比主谋) 我很高兴看到一个非常有效的algorithm,但是效率不是很高(如果不是很差的话)。 然而,一个非常有效而且有效的algorithm是不灵活且难以实现的,并没有被使用。 我已经发布了自己的(详细的)Python解决scheme,但这并不是唯一或最好的方法,所以请发布更多! 我不期待一篇文章;)

std :: set和std :: priority_queue之间的区别

由于std::priority_queue和std::set (和std::multiset )都是数据容器,它们存储元素并允许以有序方式访问它们,并具有相同的插入复杂度O(log n) (或者,什么样的情况需要这个或那个?)? 虽然我知道潜在的结构是不同的,但我并不那么感兴趣,因为我在比较它们的性能和各种用途的适用性 。 注:我知道一套中没有重复。 这就是为什么我还提到了std::multiset因为它具有与std::set完全相同的行为,但是可以在允许存储的数据作为相等元素进行比较的情况下使用。 所以,请不要评论单个/多个密钥的问题。

C#相当于使用python slice操作旋转列表

在Python中,我可以列出my_list并旋转内容: >>> my_list = list(range(10)) >>> my_list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> new_list = my_list[1:] + my_list[:1] >>> new_list [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] C#中的等价方法是创build一个由两个现有C#列表组成的新列表? 我知道如果有必要,我可以通过蛮力产生。

编写一个将文本作为input的程序,并生成一个能够再现该文本的程序

最近我遇到了一个很好的问题,这个问题变得简单易懂,很难find解决办法。 问题是: 编写一个程序,从input中读取文本,并在输出上打印其他程序。 如果我们编译并运行打印的程序,它必须输出原文。 input文本应该是相当大的(超过10000个字符)。 唯一的(也是非常强大的)要求是档案的大小(即打印的程序)必须严格小于原始文本的大小。 这使得不可能明显的解决scheme std::string s; /* read the text into s */ std::cout << "#include<iostream> int main () { std::cout<<\"" << s << "\"; }"; 我相信这里会使用一些归档技术。

如何删除堆数据结构?

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

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

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