以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  还是全排列问题  (http://foxtable.com/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
--  

 举例说明一下具体需求