网站首页
IC库存
IC展台
电子资讯
技术资料
PDF文档
我的博客
IC72论坛
ic72 logo
搜索关键字: 所有资讯 行业动态 市场趋势 政策法规 新品发布 技术资讯 价格快报 展会资讯
  • 达普IC芯片交易网 > 新闻中心 > 技术资讯 > 正文
  • RSS
  • Java技巧:教你 amb 解决排列组合问题
    http://www.ic72.com 发布时间:2009/10/21 14:58:09

        看到这么一个题目:

      {3,2,2,6,7,8}排序输出,7不在第二位,68不在一起。

        这样的题目似乎避免不了遍历,关键还在于过滤条件的安排,怎么让过滤的范围尽量地小。通常的做法是循环遍历,对于类似Prolog这样的语言来说,由于内置了推理引擎,可以简单地描述问题,让引擎来帮你做递归遍历,解决这类问题是非常简单的。Prolog好久没写,以Ruby的amb操作符为例来解决这道题目:

        #结果为hash,去重

        $hash={}

        amb=Amb.new

        array=[3,2,2,6,7,8]

        class << array

        alias remove delete

        def delete(*nums)

        result=dup

        nums.each do |n|

        result.delete_at(result.index(n)) if result.index(n)

        end

        result

        end

        end

        #从集合选元素

        one=amb.choose(*array)

        two=amb.choose(*(array.delete(one)))

        three=amb.choose(*(array.delete(one,two)))

        four=amb.choose(*(array.delete(one,two,three)))

        five=amb.choose(*(array.delete(one,two,three,four)))

        six=amb.choose(*(array.delete(one,two,three,four,five)))

        #条件1:第二个位置不能是7

        amb.require(two!=7)

        #条件2:6跟8不能一起出现

        def six_eight_not_join(a,b)

        "#{a}#{b}"!="68"&&"#{a}#{b}"!="86"

        end

        amb.require(six_eight_not_join(one,two))

        amb.require(six_eight_not_join(two,three))

        amb.require(six_eight_not_join(three,four))

        amb.require(six_eight_not_join(four,five))

        amb.require(six_eight_not_join(five,six))

        #条件3:不重复,利用全局hash判断

        def distinct?(one,two,three,four,five,six)

        if $hash["#{one},#{two},#{three},#{four},#{five},#{six}"].nil?

        $hash["#{one},#{two},#{three},#{four},#{five},#{six}"]=1 #记录

        true

        else

        false

        end

        end

        amb.require(distinct?(one,two,three,four,five,six))

        puts "#{one},#{two},#{three},#{four},#{five},#{six}"

        amb.failure

        三个条件的满足通过amb.require来设置,这里安排的只是一种顺序,可以根据实际测试结果来安排这些条件的顺序以最大程度地提高效率。代码注释很清楚了,我就不多嘴了。Ruby amb的实现可以看这里。


    www.ic72.com 达普IC芯片交易网
  • 行业动态
  • 市场趋势
  • 政策法规
  • 新品发布
  • Baidu

    IC快速检索:abcdefghijklmnopqrstuvwxyz0123456789
    COPYRIGHT:(1998-2010) IC72 达普IC芯片交易网
    客户服务:service@IC72.com 库存上载:IC72@IC72.com
    (北京)联系方式: 在线QQ咨询:点击这里给我发消息 联系电话:010-82614113 传真:010-82614123
    京ICP备06008810号-21 京公网安备 11010802032910 号 企业资质