【问题标题】:Link numbers with an equation/algorithm将数字与方程式/算法联系起来
【发布时间】:2014-09-18 21:40:48
【问题描述】:

我正在用 Visual Basic 制作一个字谜求解器,当你输入一个字符串时,它会为你提供所有可能的组合。我需要根据字符串中字符的数量以及有多少不同的字符来计算有多少组合。

例如

示例字符串:

abc

总字符数:3,不同字符数:3

可能的组合:6

abc、acb、bac、bca、cab、cba

我需要一个方程式(使用字符数和不同字符)将其链接到包含不同数量字符的字符串。 我一直在使用反复试验来尝试找出答案,但我无法完全理解它。到目前为止,我有:

((字母 - 1) ^ (不同字母 - 1)) + (字母 - 1)

它适用于几种不同的字母计数,但现在适用于所有。

请帮忙???

【问题讨论】:

  • 我真的不明白排列在做什么以及它与我的问题有何关系
  • 啊,我有点理解他在做什么,但我不知道它实际上是如何工作的......
  • 您所要求的称为排列。他以char数组开头,你以字符串开头,但你现在知道字符串基本上是char数组,所以连接应该很简单
  • 我有点理解,但他格式化它的方式没有评论和奇怪的变量名,我无法理解它。

标签: vb.net algorithm visual-studio-2012 math anagram


【解决方案1】:

我会引导您找到答案,但我会尝试在此过程中进行解释。假设您有 10 个不同的字母。第一个有 10 个选择,第二个有 9 个,第三个有 8 个,等等。最终,将有 10*9*8*7*6...*2*1 = 10!可能性。但是,有时您会有同一个字母的多个实例。例如,将它用于字符串“aaabcd”会高估可能性,因为它将每个 a 都视为不同的字母,即使它们不是。要纠正这一点,您必须除以重复字母数的阶乘。计算可能性总数的一个好方法是(总字母阶乘)/(每个字母重复实例数的阶乘乘积)。

例如: 有 6!/(3!) 种方式来排列“aaabcd”中的字母
有6个!排列字母的方法是“abcdef”
有 6!/(3!*2!) 种方式排列“aaabbc”中的字母
有 10!/(5!*3!*2!) 种方式排列“aaaaabbbcc”中的字母

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    对于可能的计数,与计算Multinomial Coefficient完全相同

    一个简单的解释是,对于没有重复的字符, 这只是排列 = n! (画个树形图很容易理解,第一个字符有nchoices,第二个字符有n-1choices...等等)

    但是,由于您可能有重复的字符,因此您将重复计算其中的许多字符。

    让我们看一个简单的例子:对于aaa,有多少种可能的安排如果我们计算结果是否相同? 答案是3!(aaa,aaa,aaa,aaa,aaa,aaa)

    这给了我们一个想法,当我们有一个字符出现m 次时,我们将计数m! 而不是1

    所以计数只是n!(所有可能的安排,包括相同的结果)/m!(一个字符出现m次) 更多字符重复相同:n!/a!b!c!..(第一个字符出现a 次,另一个出现b 次...)

    如果你理解了背后的概念,那么你会发现,实际上对于那些“不重复”的字符,它只是分割一个1!。例如,字符(多)集={a,a,a,b,b,c},#a=3,#b=2,#c=1,所以答案(不重复计数)是(3+2+1)!/3!2!1!,这种格式的分数被命名为多项式系数如上所述。

    从编程的角度来看,您可以使用简单的 for 循环预先计算所有阶乘(n 非常小,尽管 n~30 已经太大而无法存储变量)

    declare frac = array(n); 
    frac[0] = 1;
    FOR i=1; i<=n;i++
        frac[i] = i*frac[i-1]
    

    对于较大的n,您可以在循环中即时计算double/float 除法以避免溢出。但您可能会遇到精度问题。

    如果您进一步需要输出不同的字符串,您可以使用DFS 来回溯所有可能的结果。或者如果你可以使用其他语言,比如 C++,你可以在对字符集进行排序后使用像 next_permutation() 这样的内置函数。

    【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2023-03-03
    相关资源
    最近更新 更多