Prob_Solve 板


LINE

※ [本文转录自 C_and_CPP 看板] 作者: chrisdar (克里斯) 看板: C_and_CPP 标题: [问题] 关於重复组合的演算法问题 时间: Tue Dec 9 14:01:13 2008 关於重复组合的演算法问题 我想了一个演算法模仿next_permutation(叠代型), 我称做 next_combination。 用法类似这样 string ss("0011223344"); do{ cout << ss.substr(0,3) << endl; }while (next_combination(ss.begin(),ss.begin()+3,ss.end())); 举例0011223344要取3个作组合 0011223344 ├─┤ → 1必须要向後找到一个大於他的与之交换 0021123344 ├───┤ 0031122344 ├─────┤ ↗0041122334 由於4找不到比他大的,则往 0041122334 / ├┼┼┤ →前推移一位, 04 跟 11 交换 ├┼┼┤ → 0110422334 0110223344 ╲ ├────┤→交换後需要rotate旋转1次 ├─┤ ↘0110223344 0120123344 ├───┤ 0130122344 ├─────┤ ↗0140122334 由於4找不到比他大的,则往 0140122334 ╱ ├┼──┼┤ →前推移一位, 14 跟 22 交换 ├┼──┼┤ → 0220114334 0220113344 ╲ ├──┤→交换後需要rotate旋转1次 ├───┤ ↘0220113344 0230112344 ├─────┤ ↗0240112334 由於4找不到比他大的,则往 0240112334  ╱ ├┼────┼┤ →前推移一位, 24 跟 33 交换 ├┼────┼┤ → 0330112244 0330112244 ╲ ├┤→交换後需要rotate旋转1次 ├─────┤ ↘0330112244 0340112234 ├┼──────┼┤→原本要交换两个因为到底了就只换一个 0440112233 ├┼┼──┼┼┤ ┐ ↗0440112233 由於4找不到比他大的,则往 1120023344 ↓╱ ├┼┼─┼┼┤ →前推移1+1位,044跟 112交换 ├───┤ └ 1120044233 1130022344 ╲ ├───┤→交换後需要rotate旋转2次 ├─────┤ ↘1120023344 1140022334 ├┼──┼┤ →同之前的算法 1220013344 ├───┤ 1230012344 ├─────┤ 1240012334 ├┼────┼┤ →同之前的算法 1330012244 ├─────┤ 1340012234 ├┼──────┼┤→原本要交换两个因为到底了就只换一个 1440012233 ├┼┼───┼┼┤ →同之前的算法 2230011344 ├─────┤ 2240011334 ├┼────┼┤ 2330011244 ├─────┤ 2340011234 ├┼──────┼┤→原本要交换两个因为到底了就只换一个 2440011233 ├┼┼─────┼┼┤→原本要交换三个因为到底了就只换两个 3340011224 ├┼──────┼┤→原本要交换两个因为到底了就只换一个 3440011223 ├────────┤ →完全找不到比 344还大的就旋转 3次。 并 return false 0011223344 我想问一下: 0.这是正确得演算法吗? 1.这个演算法的时间复杂度是O(n)吗? 2.有更有效率的做法吗? 3.这个演算法好不好实作? --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.23.35.94
1F:推 gba356:我比较有问题的是 04 和 11 交换,要怎麽判断选择 11 ? 12/09 17:14
2F:→ gba356:又 1, 1 不一定相连呀,所以可能每次要 sort 一次 12/09 17:15
3F:→ gba356:rotate 的部分应该是 sort 吧,用 sort 才能保证找到最小字 12/09 17:15
4F:→ gba356:点序 12/09 17:15
5F:→ gba356:例如 ss("0014433221") 呢? 12/09 17:17
6F:→ chrisdar:next_combination跟next_permutation一样 使用前要先排序 12/09 17:30
0041122334 └─────── →一直找不到比4大的 0041122334 └─┘ →找到比0大的 0041122334 ├─┤ →交换0跟1 0140122334 ├─┤ →交换4跟1 0110422334 ├────┤ →交换後需要rotate旋转1次 0110223344 1340012234 └─────── →一直找不到比4大的 1340012234 └───────┘ →找到比3大的 1340012234 ├───────┤ →交换3跟4 1440012233 ├─────── →这边因为没东西可以换了就不用换了 1440012233 也不用旋转了
7F:推 gba356:next_permutation() 不用吧..这是他方便之所在.. 12/09 17:36
0014433221 他是某一个 next_permutation 的解 (解1可以叠代出解2) 不是我的 next_combination 的解 (我认为的) 不过可以加上 sort 来转换 这个倒是可以加进去 说明可以这样写明 如果输入不属於解空间之一则会转换到下一个解 0014433221 -> 0021123344 ※ 编辑: chrisdar 来自: 163.23.35.94 (12/09 17:57) --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.23.35.94
8F:推 hannibal0416:推一下,感觉打的很辛苦 08/18 13:31







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP