免费注册 查看新帖 |

Chinaunix

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

列表计算问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-05 21:13 |只看该作者 |倒序浏览
各位大侠,小弟现在有一个对列表作计算的问题,不知道怎么写比较好

现在有这样一个列表data,如下:
O B M
1 - -
2 - -
3 1 -
4 1 2
5 3 4
6 1 4
7 5 6

想计算一下这些数字所指代的事物之间的内部关系,
具体的计算方法是:

对角线数字的计算方法:
1、当Bi或Mi不存在时,A(ii)=1,如A(11)=1, A(22)=1, A(33)=1
2、当Bi和Mi都存在时,A(ii)=1+0.5A(BiMi),如A(44)=1+0.5A(B4M4)=1+0.5A(12)=1+0=1,   A(55)=1+0.5A(B5M5)=1+0.5A(34)=1+0.5*0.25=1.125

非对角线数字的计算方法:
Aij=Aji
1、当Bj和Mj都不存在时,A(ij)=0,如A(12)=A(21)=0,此时的B2和M2都不存在
2、当Bj存在,Mj不存在,A(ij)=0.5A(iBj),如A(13)=A(31)=0.5A(1B3)=0.5A(11)=0.5*0.5=0.25,  A(23)=A(32)=0.5A(2B3)=0.5A(21)=0
3、当Bj不存在,Mj存在,A(ij)=0.5A(iMj),计算方法同上类似
4、当Bj和Mj都存在时,A(ij)=0.5(A(iBj)+A(iMj)),如A(34)=0.5(A(3B4)+A(3M4))=0.5(A(31)+A(32))=0.5*0.5=0.25,此时B4和M4都存在

故这样计算的结果如下:
1 0 0.5 0.5  0.5   0.75   0.625
   1 0    0.5  0.25  0.25   0.25
      1   0.25 0.625 0.375  0.5
             1    0.625 0.75   0.6875
                   1.125 0.5625 0.84375
    对称                    1.25   0.90625
                                      1.28125

不知道这个程序应该怎么写比较好些呢?请大家支支招

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-09-05 23:25 |只看该作者
看晕了~坐等大神回复吧。。。。

我的理解是,建立一个二维数组,然后每读入一行存到hash(以位置为key),然后得到所有的组合后替换对应的数组元素~

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
3 [报告]
发表于 2014-09-06 17:54 |只看该作者
输出结果:
  1. 1       0       0.5     0.5     0.5     0.75    0.625
  2. 0       1       0       0.5     0.25    0.25    0.25
  3. 0.5     0       1       0.25    0.625   0.375   0.5
  4. 0.5     0.5     0.25    1       0.625   0.75    0.6875
  5. 0.5     0.25    0.625   0.625   1.125   0.5625  0.84375
  6. 0.75    0.25    0.375   0.75    0.5625  1.25    0.90625
  7. 0.625   0.25    0.5     0.6875  0.84375 0.90625 1.28125
复制代码
如果所有的 B, M 比行号小 ~ {:2_172:}


回复 1# newfinder


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2014-09-06 17:56 |只看该作者
本帖最后由 pitonas 于 2014-09-06 10:57 编辑

我的理解 ~ {:2_172:}
  1. #!/usr/bin/perl
  2. use 5.010;
  3. my @A;
  4. my @B = map [ @_ = split, ~~ grep /-/, @_[ 1, 2, 2 ] ], <DATA>;

  5. for my $i ( 1 .. $#B ) {
  6.     $A[$i][$i] = SA($i, $i);
  7.     $A[$_][$i] = $A[$i][$_] = SA( $i, $_ ) for $i + 1 .. $#B;
  8. }

  9. say join "\t", splice @$_, 1 for splice @A, 1;

  10. sub SA {
  11.     my ( $i, $j, $k ) = ( @_, $B[ $_[-1] ][-1] );
  12.     $i == $j
  13.     ? ( $k ? 1 : 1 + $A[ $B[$i][1] ][ $B[$i][2] ] * 0.5 )
  14.     : ( $k == 0 ? $A[$i][ $B[$j][1] ] + $A[$i][ $B[$j][2] ] :
  15.         $k == 1 ? $A[$i][ $B[$j][2] ] :
  16.         $k == 2 ? $A[$i][ $B[$j][1] ] : 0 ) * 0.5
  17. }
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2014-09-06 20:46 |只看该作者
回复 4# pitonas


    niubility~~~~~~

论坛徽章:
0
6 [报告]
发表于 2014-09-07 00:32 |只看该作者
回复 2# huang6894

……坐等
   

论坛徽章:
0
7 [报告]
发表于 2014-09-07 00:33 |只看该作者
回复 4# pitonas

好赞好赞!!
是这样子的,大侠威武啊!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP