Fortran Coder

查看: 13441|回复: 10

[通用算法] 数据排列组合 求一算法

[复制链接]

8

帖子

1

主题

0

精华

入门

F 币
78 元
贡献
36 点
发表于 2015-2-4 22:20:13 | 显示全部楼层 |阅读模式
本帖最后由 yccpp 于 2015-2-4 22:50 编辑

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

原始数据
22875    30588   
22875    34747        
22912    34851
22963    35901     
22969    30588
30588    40791
30609    39143     
30609    40808

重新排列后的输出
22875    30588   34747 22969  40791
22912    34851
22963    35901
30609    39143   40808

number.zip

78.96 KB, 下载次数: 4

数据

8

帖子

1

主题

0

精华

入门

F 币
78 元
贡献
36 点
 楼主| 发表于 2015-2-4 22:25:35 | 显示全部楼层
不知为何我打开时背景是红色的,编辑时也没法调

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
发表于 2015-2-5 08:42:40 | 显示全部楼层
我打开看是正常的,不是红色的。不需要编辑。

有一个疑问:

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

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

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

8

帖子

1

主题

0

精华

入门

F 币
78 元
贡献
36 点
 楼主| 发表于 2015-2-5 15:28:55 | 显示全部楼层
谢谢VVT,按你说的,如果下面加一行 35555 22963,也要加在一起,输出结果的第三行就变为 22963 35901 35555.谢谢关注。

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-2-6 07:31:33 | 显示全部楼层
[Fortran] 纯文本查看 复制代码
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

8

帖子

1

主题

0

精华

入门

F 币
78 元
贡献
36 点
 楼主| 发表于 2015-2-8 01:12:51 | 显示全部楼层
谢谢fcode的帮助。

8

帖子

1

主题

0

精华

入门

F 币
78 元
贡献
36 点
 楼主| 发表于 2015-2-21 23:32:36 | 显示全部楼层
fcode你好,运行你的程序后,感觉没有判断完全,可能是我没有把问题描述清楚,在输入文件中,如果a 和b是一对,b和c是一对, c和d是一对, a和c是一对, b和d是一对,以此类推,则在输出时把这些数据都归在一起写在一行。谢谢,祝春节快乐!

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-2-22 05:53:38 | 显示全部楼层
你最好是结合实例来说明你的需求。

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

8

帖子

1

主题

0

精华

入门

F 币
78 元
贡献
36 点
 楼主| 发表于 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
谢谢。

1958

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1339 元
贡献
565 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2015-2-22 22:28:50 | 显示全部楼层
用我的代码执行后,输出为 2 行:
33035 40381 44096 40374 48872
38659 44165 53155

你能说说为什么要写成1行吗?
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-19 10:23

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表