yccpp 发表于 2015-2-4 22:20:13

数据排列组合 求一算法

本帖最后由 yccpp 于 2015-2-4 22:50 编辑

本人想用fortran进行数据的重新排列组合,向大神求一算法。原始数据是多行两列的数据,想把有公共数据的行写成一行且公共数据只出现一次。关键是公共数据不是固定的,下面是一个小例子,第一行和第二行的第一列有相同数22875,而第一行第二列的数据30588又出现在了第五行和第六行,需要把这些数据写成一行,如果没有公共数据,就按原始数据写出。整个数据文件见附件。非常感谢您的帮助!
原始数据22875    30588    22875    34747      22912    3485122963    35901   22969    3058830588    4079130609    39143   30609    40808
重新排列后的输出22875    30588   34747 2296940791 22912    34851 22963    3590130609    39143   40808

yccpp 发表于 2015-2-4 22:25:35

不知为何我打开时背景是红色的,编辑时也没法调

vvt 发表于 2015-2-5 08:42:40

我打开看是正常的,不是红色的。不需要编辑。

有一个疑问:

如果出现一行,第一个数据是未出现过的,而第二个是出现过的。如何处理?

比如你的算例,下面加一行:
35555 22963

其中 22963 出现过,而 35555 未出现过。

yccpp 发表于 2015-2-5 15:28:55

谢谢VVT,按你说的,如果下面加一行 35555 22963,也要加在一起,输出结果的第三行就变为 22963 35901 35555.谢谢关注。

fcode 发表于 2015-2-6 07:31:33

Program www_fcode_cn
Implicit None
Integer , parameter :: N = 15749!// 行
Integer , parameter :: N_rows = N !// 行
Integer :: idata( 2 , N ) , idata_row( 2 , N )
Integer :: currRow , i , j , k
Logical :: b( 2 )
currRow = 0
Open( 12 , File = "Number.txt" )
Open( 13 , File = "Number1.txt" )
Do i = 1 , N
    Read( 12 , * ) idata( : , i )
    j = 0
    b = .false.
    Do j = 1 , i-1
      b(1) = ( any( idata(1,i) == idata(:,j) ) )
      b(2) = ( any( idata(2,i) == idata(:,j) ) )
      if ( any(b) ) exit
    End Do
    if ( j > 0 .and. j <= i-1 ) then
      if( b(1) .and. .NOT.b(2) ) then
      idata_row( 1 , i ) = 0
      idata_row( 2 , i ) = idata_row( 1 , j )      
      elseif( b(2) .and. .NOT.b(1) ) then
      idata_row( 2 , i ) = 0
      idata_row( 1 , i ) = idata_row( 2 , j )
      else
      idata_row( : , i ) = 0
      end if
    else
      currRow = currRow + 1
      idata_row( : , i ) = currRow
    end if
End Do
Do i = 1 , currRow
    Do j = 1 , N
      if ( idata_row(1,j) == i ) then
      write( 13 , '(g0,1x)' , advance='no' ) idata(1,j)
      end if
      if ( idata_row(2,j) == i ) then
      write( 13 , '(g0,1x)' , advance='no' ) idata(2,j)
      end if
    End Do
    write(13,*)
End Do
Close( 12 )
Close( 13 )
End Program www_fcode_cn

yccpp 发表于 2015-2-8 01:12:51

谢谢fcode的帮助。

yccpp 发表于 2015-2-21 23:32:36

fcode你好,运行你的程序后,感觉没有判断完全,可能是我没有把问题描述清楚,在输入文件中,如果a 和b是一对,b和c是一对, c和d是一对, a和c是一对, b和d是一对,以此类推,则在输出时把这些数据都归在一起写在一行。谢谢,祝春节快乐!

fcode 发表于 2015-2-22 05:53:38

你最好是结合实例来说明你的需求。

列举几个数字,告诉我排列后应该是什么样子?

yccpp 发表于 2015-2-22 19:11:10

谢谢fcode,下面是从我的附件中摘取的一组应该写在一起的数据,他们在number文件中的形式是
33035    40381
33035    44096
38659    44165
40374    40381
40381    48872
44165    53155
48872    53155
48872    54478
48872    56608
53155    60902
54478    56608
54478    60902
每一组数据中都有一个数据与另外至少一组数据中的一个数据相同,则把这些数据写在一起,输出后的形式为
33035        38659        40374        40381        44096        44165        48872        53155        54478        56608        60902
谢谢。

fcode 发表于 2015-2-22 22:28:50

用我的代码执行后,输出为 2 行:
33035 40381 44096 40374 48872
38659 44165 53155

你能说说为什么要写成1行吗?
页: [1] 2
查看完整版本: 数据排列组合 求一算法