以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 还是全排列问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=87355) |
-- 作者:lur320 -- 发布时间:2016/7/8 22:13:00 -- 还是全排列问题 大大,120个字符的怎么全排列啊? 我试过了递归,但是机器受不了这么大的数字。。 我的过程是这样的: 1、将需要进行排序的行数找出来,例如有120行。 2、定义一个相同数量的数组,使用chr(-20226-行数)给每数组内每一个元素赋值一个汉字字符,一个汉字对应一行(只有汉字有这么多的不重复字符) 3,将这个数组进行递归全排列。 4,将每一个排序中汉字对应的行的内容进行切换时间的计算,这个有其他函数搞定。 5,得到切换时间最小的那个料号序列。 在行数小于10左右,就是10行料号的情况下,是可以的。 但是120个料号的全排列做不到。。也就是进行到第三部就死机了。 所以有没有交换字符的排列法? 这样我就可以拍一个算一个,直至算完,也不会因为一次性算120!那么大的数组而崩溃。 大致的思路就是: 1、找到不为空的行,例如120行。 2、定义一个相同数量的数组,使用chr(-20226-行数)进行赋值,每个元素一个汉字字符 3、进行第一次排列 4、查找第一次排序的汉字顺序和对应的行,再调用其他函数进行切换时间的计算 5、与上次排列的切换时间进行对比,并取小值 6、进行下一次排序和进行比较 。。。。 7、得到最小切换时间的汉字序列,找到与之对应的行的排序。 我看了网上的非递归算法都是比较数字大小,但是汉字怎么用交换的排序?
[此贴子已经被作者于2016/7/8 22:19:40编辑过]
|
-- 作者:lur320 -- 发布时间:2016/7/9 17:00:00 -- 想了如下代码,应该可以用 Dim i,n As Integer, j As Integer Dim p() As String =args(0) Dim temp As String n= 4 Return p i = n - 1 Do While i >= 0 If p(i) < p(i + 1) Then For j = n To i + 1 Step -1 \'从排列右端开始 If p(i) <= p(j) Then Exit For \'找出递减子序列 Next temp = p(j) p(j) = p(i) p(i) = temp \'将递减子序列前的数字与序列中比它大的第一个数交换 For j = n To 1 Step -1 \'将这部分排列倒转 i = i + 1 If i >= j Then Exit For temp=p(j) p(j)=p(i) p(i)=temp Next Return p \'输出一个排列 i = n End If i = i - 1 Loop
|
-- 作者:大红袍 -- 发布时间:2016/7/10 11:36:00 -- 120个字符,列出所有的可能,你知道有多少种可能吗?肯定要死机啊。
如果只是对字符进行升序或者降序的排列,就是你表达有问题,用比较排序法就行了
http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=83981&skin=0
|
-- 作者:lur320 -- 发布时间:2016/7/10 14:28:00 -- 168个0吧。 已经不用排列来算最优化的可能性了。。找其他方法
|
-- 作者:大红袍 -- 发布时间:2016/7/11 5:18:00 -- 举例说明一下具体需求 |