相关疑难解决方法(0)

如何提高生成下一个词典排列的算法的效率?

这里必须注意的是,我在纸上手工进行了数学计算,以得出上述证明.我不确定单独使用现代计算机的介质是否会证明这些证据.

下面使用的"效率"的定义意味着在最短的时间内完成算法的离散部分或整个算法.数学上,编程上或计算上都是如此.

在进一步检查从原始集合或当前排列生成下一个词典排列的程序时,在没有递归函数调用的情况下重新阅读@chqrlie在Permutations的答案之后,我开始通过在纸上写索引来试图观察任何可用于执行特定任务的索引之间的数学关系.

我发现了几个有趣的事实,其证据如下所示.

例如,当我们写出值时

a,b,c
Run Code Online (Sandbox Code Playgroud)

要么

abc
Run Code Online (Sandbox Code Playgroud)

或者,编写代表值的索引

0,1,2
Run Code Online (Sandbox Code Playgroud)

要么

012
Run Code Online (Sandbox Code Playgroud)

既然我们知道,给定一套

abc
Run Code Online (Sandbox Code Playgroud)

我们可以通过交换集合的最后两个值或索引来生成下一个词典排列

acb
Run Code Online (Sandbox Code Playgroud)

要么

021
Run Code Online (Sandbox Code Playgroud)

我们可以忽略可能是任何类型数据的值,并专注于使用索引进行检查,因为离散数更适合关联可能的关系而不是可能无限多样化的值.

因此,用原始集的第二个词典索引

abc
Run Code Online (Sandbox Code Playgroud)

我们可以将索引的值表示为数字,并观察

0,2,1
Run Code Online (Sandbox Code Playgroud)

要么

021
Run Code Online (Sandbox Code Playgroud)

第一个索引是

012
Run Code Online (Sandbox Code Playgroud)

第二个是

021
Run Code Online (Sandbox Code Playgroud)

既然我们知道.length原始集合是3,如果我们记住.length原始值集合,我们可以删除起始

0
Run Code Online (Sandbox Code Playgroud)

在哪里将索引减少到数字

12
Run Code Online (Sandbox Code Playgroud)

21
Run Code Online (Sandbox Code Playgroud)

分别.其中0可以作为原始集合的索引引用0,以便在下一个操作的结果集小于原始集合时获取索引处的值.

当我们尝试绘制12和之间的潜在关系时21,我们发现了这一点

21 - 12 = 9
Run Code Online (Sandbox Code Playgroud)

当我们继续时,我们发现下一个词典索引是

102
Run Code Online (Sandbox Code Playgroud)

减去以前的索引

102 - 21 = 81
Run Code Online (Sandbox Code Playgroud)

102下一个词典排列在哪里,表示为值

bac
Run Code Online (Sandbox Code Playgroud)

它为我们提供了数字9之间的共同关系,用数字表示

9
Run Code Online (Sandbox Code Playgroud)

对于表示为数字的无限输入值集合,这种关系是明显的和可再现的.我们可以根据观察者的视角,将关系图绘制成两个斜率,当从结果排列集的第一个值开始绘制图形时,它具有倒置的顶点偏移

// graph 1
0,9,81

// graph …
Run Code Online (Sandbox Code Playgroud)

javascript language-agnostic algorithm math permutation

9
推荐指数
2
解决办法
1241
查看次数

构成长度为N的字符串的最有效方法是什么,其中从af,0-9中选择随机字符

的要求是,以确定最有效的方法来呈现一个字符串,例如,"#1a2b3c",其中"1a2b3c"随机从该组中选择

"abcdef0123456789"

要么

["a", "b", "c", "d", "e", "f", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]


为了比较结果的一致性,弦.length应该是精确的7,如上面的例子所示.

确定过程时间的迭代次数应10000如下面的代码所示.


我们可以通过两个前瞻性的例子和基准来开始调查.这些方法的基准应包括在答案的文本中.请注意,如果可以使用更准确的基准测试,或者可以改进问题文本,请在评论时提出建议.相关:能够流利使用Javascript的人向我解释这里发生的事情简单.

function randColor() {
  return '#' + (function co(lor) {
    return (lor += [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'][Math.floor(Math.random() * 16)]) &&
      (lor.length == 6) ? lor : co(lor);
  })('');
}

console.time("random string recursion");

for (let i …
Run Code Online (Sandbox Code Playgroud)

javascript performance performance-testing coding-efficiency

9
推荐指数
1
解决办法
340
查看次数