免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: marksman201
打印 上一主题 下一主题

shell排序 [复制链接]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
131 [报告]
发表于 2010-09-30 13:59 |只看该作者
这些都没学过。惭愧,要补课了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
132 [报告]
发表于 2010-09-30 14:06 |只看该作者
以前用php做过一个标签云,规则是提及次数多的权重大(表现为字体大),在固定大小的框里尽可能塞进更多数量的标签,无序排列。后来才知道,这是“背包”的一种。。。。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
133 [报告]
发表于 2010-09-30 14:21 |只看该作者
回复 131# blackold


    = =黑哥太谦虚了,要是我经验有黑哥这么丰富就不愁工资低了~~

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
134 [报告]
发表于 2010-09-30 14:22 |只看该作者
回复 132# 昭襄王


    肯定还有其他的规则吧?(比如时间啥的),否则最优算法肯定会把那些占位置的最大的标签都喀嚓掉的……

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
135 [报告]
发表于 2010-09-30 14:25 |只看该作者
回复  昭襄王


    肯定还有其他的规则吧?(比如时间啥的),否则最优算法肯定会把那些占位置的最大的 ...
starwing83 发表于 2010-09-30 14:22



    有其他规则,年代久远,忘了,大体是这个意思。字号是有上限的,还有只考虑前多少位的,当然是有时间限制的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
136 [报告]
发表于 2010-09-30 16:24 |只看该作者
用php写了一个,排序后冒泡
  1. <?php
  2. /**
  3. * file "lines" gives like this
  4. * a:0.13 b:0.23 c:0.05 d:0.45 e:0.07
  5. * p:0.01 q:0.20 r:0.13 s:0.33 t:0.23
  6. *
  7. * */
  8. $content = file_get_contents('lines');
  9. $rows = explode("\n",$content);

  10. function string2KeyedArray($string, $delimiter = " ", $kv = ":") {
  11.   if ($a = explode($delimiter, $string)) { // create parts
  12.     foreach ($a as $s) { // each part
  13.       if ($s) {
  14.         if ($pos = strpos($s, $kv)) { // key/value delimiter
  15.           $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
  16.         } else { // key delimiter not found
  17.           $ka[] = trim($s);
  18.         }
  19.       }
  20.     }
  21.     return $ka;
  22.   }
  23. } // string2KeyedArray

  24. function arrSumMax($arrSum , $sortedArr){
  25.   if($arrSum < 0.5){ //print the line
  26.     foreach($sortedArr as $k => $v){
  27.       echo $k.":".$v." ";
  28.     }
  29.       echo "<br />";   
  30.   }
  31. }

  32. foreach($rows as $line){
  33.   $sortedArr = string2KeyedArray($line);
  34.   $arrSum = array_sum($sortedArr);
  35.   arrSumMax($arrSum , $sortedArr);
  36.   asort($sortedArr); //sort array return 1
  37.   while($arrSum > 0.5) {
  38.     $arrSum = array_sum($sortedArr) - array_pop($sortedArr); //pop last
  39.     arrSumMax($arrSum , $sortedArr);
  40.   }  
  41. }
  42. ?>
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
137 [报告]
发表于 2010-09-30 18:16 |只看该作者
呵呵,真没提及过这些,严蔚敏的那本书。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
138 [报告]
发表于 2010-09-30 18:17 |只看该作者
回复 129# starwing83

晕了,是等于0.4,唉,中午脑子有问题啊。哈哈
下午专门跑去看了这个算法,很有趣。

论坛徽章:
0
139 [报告]
发表于 2010-10-02 10:20 |只看该作者
不好意思,shell有点生疏了,还是perl好,嘿嘿。

#!/usr/bin/perl -w
use strict;

open(FHANDLE, "a.txt" or die "Can't open file: $!\n";
while(<FHANDLE> {
    my @arr = split(/ /, $_);
    my $arrlen = $#arr+1;
    my %hash;
    for(my $i=0; $i<$arrlen; $i++) {
        my ($key, $value) = split(/:/, $arr[$i]);
        $hash{$key} = $value;
    }
    my @ordered_arr = sort { $hash{$a} <=> $hash{$b} } keys(%hash);
    my $sum = 0;
    for(my $j=0; $j<$arrlen; $j++) {
        if(($sum += $hash{$ordered_arr[$j]}) >= 0.5) {
            $sum -= $hash{$ordered_arr[$j]};
            print "sum: " . $sum . " - ";
            for(my $k=0; $k<$j; $k++) {
                print "$ordered_arr[$k]hash{$ordered_arr[$k]} ";
            }
            print "\n";
            last;
        }
    }
}

输出:
sum: 0.48 - c:0.05 e:0.07 a:0.13 b:0.23
sum: 0.34 - p:0.01 r:0.13 q:0.20

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
140 [报告]
发表于 2010-10-02 11:24 |只看该作者
回复 139# bruclan


    是用了hash表吗?
PS:那个最优解用shell搞有无思路?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP