请问这个算法时间复杂度是否为 O(n!)

2015-10-11 16:18:18 +08:00
 luoway
对于字符串的所有字符组合,我设计了如下算法:
eg."abc"

abc
ab, ac, bc
a, b, c
可见下层是上层每个结果去除一个字符,经过去重得到的结果。

那么程序可以这样写

递归函数名 (字符串){
__保存字符串;
__for 循环对字符串遍历{
____函数:删除该字符串中的某位置字符,返回新字符串____//此处被运算总计 n!次
____if 判断新字符串长度>1 则,
______递归函数(新字符串)
____否则,保存新字符串
__}


如注释,该算法的渐近时间复杂度即为 O(n!)
2651 次点击
所在节点    程序员
9 条回复
zzy8200
2015-10-11 17:20:27 +08:00
为什么不用 2^n 算法?
luoway
2015-10-11 17:24:58 +08:00
@zzy8200 不会……
zzy8200
2015-10-11 23:35:30 +08:00
@luoway
for i=1 to 2^n-1
k=二进制(i)
然后用 k 给字符串做 mask ,保留 1 的位
输出
done

例: abc
i=7 ( 111 )

abc
111

->abc

i=6 (110)
abc
110

->ab
luoway
2015-10-11 23:40:51 +08:00
@zzy8200 这种情况下二进制确实好用!多谢指点!
edfward
2015-10-12 00:45:02 +08:00
题:[Subsets on LeetCode]( https://leetcode.com/problems/subsets/)
解法:[Power Set - GeeksforGeeks]( http://www.geeksforgeeks.org/power-set/)
luoway
2015-10-12 01:00:52 +08:00
@edfward 没刷过题-_-||
ryd994
2015-10-12 04:54:46 +08:00
其实不用二进制也行,还是递归
你的问题主要是有重复解
ab 去掉 b 和 ac 去掉 c 都是一样的
可以反过来,递加
a b c
ab ac bc
abc
当考虑两个字母的解的时候,只考虑当前字母往后的。比如考虑 b 开头的解,就不需要考虑 ba ,因为 ab 肯定包含
imcoddy
2015-10-12 07:46:14 +08:00
@edfward 赞。其实这题的 Discuss 里面也有人提出了这个做法的。虽然我刷这题的只是弱弱地用了 Backtracking
luoway
2015-10-12 09:02:26 +08:00
@ryd994 正序考虑过,想的是在长度 4 以上的时候先求出含 a 的所有情况(长度 1,2,3),再求不含 a 的。比较复杂。于是倒序想到这个算法。
现在使用每层长度只变 1 ,发现正序递加也能算。
如 abcd
a b c d
ab ac ad bc bd cd
abc abd acd bcd
abcd
没有重复,比递减更好。
多谢指点!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/227151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX