免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1750 | 回复: 5
打印 上一主题 下一主题

求一函数,急~~~!!!!在线等 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-26 14:04 |只看该作者 |倒序浏览
从排列组合得观念中,我们知道,若N个字母要排列,可能的情形有N!(N * (N-1)         * (N-2) .....* 2 * 1 )个
        例如:a,b,c,d 个数排列可能有 4! = 4*3*2*1 = 24个
        所有可能的情形是:
        a,b,c,d                b,a,c,d                c,a,b,d                d,a,b,c
        a,b,d,c                b,a,d,c                ....                        ....
        a,d,b,c                b,d,a,c                ....                        ....
        a,d,c,b                b,d,c,a                ....                        ....
        a,c,b,d                ....                        ....                        ....
        a,c,d,b                ....                        ....                        ....
       
        这里介绍一种演算法
        如果有两个数(1, 2)要排序,结果是:
        [1, 2] => (1,2) , (2,1)

        当第三个数(3)加进来后。
        只要在原有的所有可能排序(前,中,.....后)都插入新的数字,
        即可找出其所有可能行。结果是:
        [1,2,3] =>         (1,2) + 3 => (3,1,2) , (1,3,2), (1,2,3)
                          (2,1) + 3 => (3,2,1), (2,3,1), (2,1,3)

        问题是:
        请用你最熟悉的程式语言写一个函数 arrayInsert()
        传入一个一维的阵列与一个字元,会将这个字元插入一维的阵列中的所有可能性传出
                例如: 传入一维的阵列arr(arr = { “1”,”2'”}) 与 字元 'X'
                会传出二维的阵列 :
                        {
                                {“X”, “1”, “2”} ,
                                {“1”, “X”, “2”} ,
                                {“1”, “2”, “X”}
                        }

论坛徽章:
0
2 [报告]
发表于 2007-01-26 15:05 |只看该作者
以前看数据结构的时候,有这样一个题目,好像它是用递归来做的

论坛徽章:
0
3 [报告]
发表于 2007-01-26 17:58 |只看该作者
不考虑重复元素的话,就是个全排列的问题。

传入一维的阵列arr(arr = { “1”,”2'”}) 与 字元 'X'

其实就是,{1,2,X}的全排列

给定一个一维数组 A1,A2....AN,求出所有的可能排列:
1)当N=1
就直接返回{{A1}}
2)当N>1时,取出 A1
剩下的元素作一个全排列,返回全部可能的数组排列(二维数组)假如为RET[j][k]
那么,对其中每一个数组
RET[j]={ r1,r2,r3,r4....rm }
插入A1 到这个数组(RET[j])的每一个可能位置(可能位置为数组长度加1)
这样得到二维数组RET[j*(k+1)][k+1]就是所求的全排列


Java实现:

  1. public class Test {

  2.         /**
  3.          * @param args
  4.          *
  5.          */
  6.         public static void main(String[] args) throws Exception {
  7.                 int testa[]={1,2,3,4};
  8.                 int[][] ret=align(testa,0,4);
  9.                 printTDArray(ret);
  10.                
  11.         }
  12.                
  13.         private static void printTDArray(int[][] a)
  14.         {
  15.                 StringBuffer buffer=new StringBuffer("{\n");
  16.                 for(int j=0;j<a.length;j++)
  17.                 {
  18.                         buffer.append("{");
  19.                         for(int k=0;k<a[j].length;k++)
  20.                         {
  21.                                 buffer.append(a[j][k]);
  22.                                 if(k<a[j].length-1)
  23.                                 {
  24.                                         buffer.append(",");
  25.                                 }
  26.                         }
  27.                         buffer.append("}\n");
  28.                 }
  29.                 buffer.append("}");
  30.                 System.out.println(buffer.toString());
  31.                
  32.         }
  33.                
  34.         public static int[][] arrayAlignInsert(int a[],int x)
  35.         {
  36.                 int[][] ret=align(a,0,a.length);
  37.                 ret=arrayInsert(ret,x);
  38.                 return ret;
  39.                
  40.         }
  41.        
  42.         public static int[][] align(int[] a,int off,int len)
  43.         {
  44.                 if(len==0)
  45.                 {
  46.                         throw new IllegalArgumentException();
  47.                 }
  48.                 if(len==1)
  49.                 {
  50.                         int[][] ret=new int[1][1];
  51.                         ret[0]=new int[1];
  52.                         ret[0][0]=a[off];
  53.                         return ret;
  54.                 }
  55.                 int[][] preRet=align(a,off+1,len-1);
  56.                 return arrayInsert(preRet,a[off]);
  57.                        
  58.         }
  59.         private static int[][] arrayInsert(int[][] preRet,int toInsert)
  60.         {
  61.                 int[][] toRet=new int[preRet.length*(preRet[0].length+1)][preRet[0].length+1];
  62.                 for(int k=0;k<preRet.length;k++)
  63.                 {
  64.                         for(int j=0;j<=preRet[0].length;j++)
  65.                         {
  66.                                 toRet[k*(preRet[0].length+1)+j]=inertOneAtPos(preRet[k],j,toInsert);
  67.                         }
  68.                 }
  69.                 return toRet;
  70.         }
  71.        
  72.         private static int[] inertOneAtPos(int[] arr,int pos,int toInsert)
  73.         {
  74.                 int ret[]=new int[arr.length+1];
  75.                 if(pos>0)
  76.                 {
  77.                         System.arraycopy(arr, 0, ret, 0, pos);
  78.                 }
  79.                 ret[pos]=toInsert;
  80.                 if(pos<arr.length)
  81.                 {
  82.                         System.arraycopy(arr, pos, ret, pos+1, arr.length-pos);
  83.                 }
  84.                 return ret;
  85.                
  86.         }

  87. }
复制代码


输出:

  1. {
  2. {1,2,3,4}
  3. {2,1,3,4}
  4. {2,3,1,4}
  5. {2,3,4,1}
  6. {1,3,2,4}
  7. {3,1,2,4}
  8. {3,2,1,4}
  9. {3,2,4,1}
  10. {1,3,4,2}
  11. {3,1,4,2}
  12. {3,4,1,2}
  13. {3,4,2,1}
  14. {1,2,4,3}
  15. {2,1,4,3}
  16. {2,4,1,3}
  17. {2,4,3,1}
  18. {1,4,2,3}
  19. {4,1,2,3}
  20. {4,2,1,3}
  21. {4,2,3,1}
  22. {1,4,3,2}
  23. {4,1,3,2}
  24. {4,3,1,2}
  25. {4,3,2,1}
  26. }
复制代码

[ 本帖最后由 yovn 于 2007-1-26 18:08 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-01-27 00:15 |只看该作者
我来写一个C++版的,同样功能!


  1. #include <iostream>
  2. using namespace std;
  3. const int len = 4;

  4. void fun(int *array,int high)
  5. {
  6.         if(high==len-1)
  7.         {
  8.                 for(int i=0;i<len;i++)
  9.                 cout<<array[i]<<"  ";
  10.                 cout<<endl;
  11.         }       
  12.        
  13.         for(int i=high;i<len;i++)
  14.         {               
  15.                 int temp=array[high];
  16.                 array[high]=array[i];
  17.                 array[i]=temp;
  18.                 fun(array,high+1);
  19.                 temp=array[high];
  20.                 array[high]=array[i];
  21.                 array[i]=temp;
  22.         }
  23. }

  24. void main()
  25. {
  26.         int array[len]={1,2,3,4};
  27.         fun(array,0);       
  28. }

  29. /*结果

  30. 1  2  3  4  
  31. 1  2  4  3  
  32. 1  3  2  4  
  33. 1  3  4  2  
  34. 1  4  3  2  
  35. 1  4  2  3  
  36. 2  1  3  4  
  37. 2  1  4  3  
  38. 2  3  1  4  
  39. 2  3  4  1  
  40. 2  4  3  1  
  41. 2  4  1  3  
  42. 3  2  1  4  
  43. 3  2  4  1  
  44. 3  1  2  4  
  45. 3  1  4  2  
  46. 3  4  1  2  
  47. 3  4  2  1  
  48. 4  2  3  1  
  49. 4  2  1  3  
  50. 4  3  2  1  
  51. 4  3  1  2  
  52. 4  1  3  2  
  53. 4  1  2  3  
  54. */
复制代码

原帖由 yovn 于 2007-1-26 17:58 发表
不考虑重复元素的话,就是个全排列的问题。


其实就是,{1,2,X}的全排列

给定一个一维数组 A1,A2....AN,求出所有的可能排列:
1)当N=1
就直接返回{{A1}}
2)当N>1时,取出 A1
剩下的元素作一个全 ...

[ 本帖最后由 javacodefan 于 2007-1-27 00:37 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-01-27 01:01 |只看该作者
看来C/C++比Java要简洁一些,呵呵!
个人之见!!

论坛徽章:
0
6 [报告]
发表于 2007-01-27 12:02 |只看该作者
原帖由 javacodefan 于 2007-1-27 01:01 发表
看来C/C++比Java要简洁一些,呵呵!
个人之见!!

这个算法是经典的解法,没有语言之分。也没有返回结果,而只是在算法的运算中直接打印出来。

这个算法描述应该是这样的:
1)固定前K个元素
2)如果K为数组的长度减一,那么显然剩下的一个元素只有一个可能。于是可以打印出来
3)要不然可以让第K个元素跟K与末尾元素间的每个元素交换,这样固定前K+1个元素,然后递归求解。

算法的开始时,任何元素都没有固定,也就是传的参数为0。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP