问题标签 [heaps-algorithm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
185 浏览

algorithm - 如何阅读堆的算法?

我想生成字母 A - G(七)的所有可能排列,据称 Heap 的算法使这成为可能。

但是,当我查看Wikipedia 页面上的伪代码时,我看到了:

....不知道这意味着什么。

所以,我知道如果我有七个字母(AG),它显然会找到前六个字母的所有可能排列,而最后的字母保持不变。

意思是,它会在 G 位于末尾时找到 AF 的所有可能排列,并一直这样做直到每个字母都位于末尾。

鉴于,我有七个字母,这意味着“N”是奇数,因此我总是将结束字母(第七个)与第一个插槽中的字母切换。

但是(我知道这不是它的工作原理,但这就是我从中得到的全部)不会导致相同的两个字母不断交换并且没有不同的排列吗?

在过去的 4 个小时里,我搜索了谷歌搜索结果,但找不到任何可以逐行解释上述伪代码的内容。

非常感谢您的帮助!

0 投票
2 回答
1202 浏览

javascript - 堆算法演练

所以,我正在学习递归,我正在处理一个需要数组中元素的所有变体的编码挑战。

我被指给了Heap 的算法,这就是我到目前为止在 JavaScript 中制定的内容。

请忽略我没有将“交换”实例翻译成 JavaScript 的事实。

我有点不确定如何准确地遍历这个算法的递归部分

假设我有数组:[A,B,C,D,E]。我相信我将传递给外部函数的参数是:

在这种情况下,n 不等于 1,所以我将继续讨论“else”部分。我遇到了 for 循环,因为 n 是 5,所以它执行。

Next: 函数调用自身,但这次的参数是:

这就是我的困惑开始的地方

当我经历这个时,我是继续“if”/“else”条件还是(在递归调用之后)回到外部函数的最开始?

更新

下面是 Heap 算法的完全翻译的 JavaScript 版本。

}

我在纸上遍历它,直到我再次重复[A,B,C,D]。

以为我搞砸了,我决定实施 Prune 的控制台输出建议,看看控制台中发生了什么,这很有帮助。

修复一个小错误后,它现在工作得很好。

感谢所有帮助过的人!

0 投票
4 回答
1074 浏览

php - 无连续字母的排列数相同

这个问题与我的问题有关。我正在尝试以编程方式获得以下计数,以验证我的数学是否正确。

单词 PQRDDDEEEEFFFFF 中有多少个字母排列没有相同的连续字母?

如何使用 php 程序确定此计数?

我的方法

  1. 使用堆算法生成所有可能的排列并存储在数组中(使用堆算法,因为它被发现更快)
  2. 使用 array_unique 函数删除所有重复项
  3. 遍历数组,使用正则表达式 /(.)\1/ 识别相邻字母相同的字符串,并将没有相邻字母相同的字符串复制到新数组。
  4. 新数组具有所需的元素列表。

我的方法运行良好。但是,对于大字符串(超过 10 个字符的字符串),由于大量排列会出现内存问题,因此程序无法运行。

是否有任何替代方法可以以编程方式确定这一点?

笔记:

我只寻找计数而不是字符串列表

0 投票
2 回答
4336 浏览

algorithm - 堆的算法时间复杂度

谁能告诉我维基百科https://en.wikipedia.org/wiki/Heap%27s_algorithm中显示的这个堆算法的时间复杂度到底是多少?

我搜索了几个网站,答案都很模糊,其中一些人说时间复杂度是 O(N!) 一些人说它是 O(NlogN)。哪一个是正确答案?为什么?

谢谢你。

0 投票
2 回答
227 浏览

go - 在实现堆的排列算法时,Golang 通过具有奇怪行为的通道范围

我试图在使用通道中实现堆算法。下面的代码仅在屏幕上打印切片时工作正常,但是当使用通道将数组传递到主函数上的 for/range 循环时,会发生一些意外行为,并且切片/数组以重复打印并且并非所有排列都是发送。我想也许我在主要功能能够打印结果之前关闭了通道,但我不希望重复打印。为什么会发生这种情况,我怎样才能让它发挥作用。

0 投票
1 回答
219 浏览

php - Heap算法为什么会出现重复

我想从数组元素中获取所有排列。源数组很简单:

我编写了实现堆算法的代码,

作品的结果有很多重复

请帮助我了解原因并修复代码。我想从结果中删除任何重复。谢谢

0 投票
1 回答
98 浏览

javascript - 为什么我的排列算法对所有排列都给出相同的结果?

我坚持使用一些堆的排列算法。我编写了一些 JavaScript 代码以递归方式查找值的所有可能排列:数组或字符串。当我置换值时,我的代码似乎可以完美运行,console.log()但是当我将它们推送到另一个数组时,我得到的所有值都相同。我很困惑。

我的代码包含两个独立的函数:一个是交换元素,另一个是递归查找可能的排列:

0 投票
1 回答
641 浏览

java - 列表列表中的堆算法实现

我正在使用堆的算法来创建一个列表列表,其中包含所述列表的每个排列。每个排列将是它自己的列表。当我在算法中打印它时它可以正常工作,但是当我尝试将它添加到我的列表时它不能正常工作并且它们都是相同的数组(4、1、2、3)。我注释掉了我测试的打印以确保它正常工作。

我当前的代码:

在职的:

输出错误:

我假设我错误地使用了我的 ArrayList,但我不确定在哪里。有什么建议么?

0 投票
1 回答
90 浏览

java - 在列表的子部分中为排列创建数组

所以我有一个清单:

对于每个匹配的数字,我必须获取标识符的每个排列。我需要的示例列表如下:

我目前正在采取的解决问题的步骤:

  1. 读取列表,将每个值放入数组 ([a][12]) 并将其放入 ArrayList
  2. 然后我查找是否有任何重复的数字并在 HashMap 中记下它
  3. 然后我设置了一个 for 循环来遍历 HashMap。如果数字没有重复,我只是将其添加到列表中。如果数字确实重复,我使用堆的算法来获得每个排列。

如果我要完成它,我会将这些数字添加到这样的列表中:

我当前的代码没有按预期工作(只生成一个列表),我什至不确定如何开始编写一个会不断生成新列表的代码,同时还附加旧列表。我为迷路而道歉,我现在正在学习数据结构课程,这一切都超出了我的熟悉范围(我们刚刚开始讨论链表)。

注 1:allLists 保存所有当前列表(a、abcd、adcb),permutationList 保存列表的所有排列。

注意 2:我是通过一个布尔列表来做的,但是使用字母作为我想要完成的简单的视觉表示

我期望问题出现的代码:

0 投票
1 回答
126 浏览

php - PHP中的堆算法实现产生错误的结果

下面是一个基于堆算法的用于查找排列的 PHP 函数。该函数在 JavaScript 中运行良好,但在 PHP 中失败。为什么 ?

函数的输出应该如下:

但我得到: