精华内容
下载资源
问答
  • 组合模式

    千次阅读 2019-09-25 20:43:06
    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

    这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

    我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。

    介绍

    意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

    何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    如何解决:树枝和叶子实现统一接口,树枝内部组合该接口。

    关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

    应用实例 :1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

    优点 :1、高层模块调用简单。 2、节点自由增加。

    缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

    **使用场景:**部分、整体场景,如树形菜单,文件、文件夹的管理。

    注意事项:定义时为具体类。

    实现

    我们有一个类 Employee,该类被当作组合模型类。CompositePatternDemo,我们的演示类使用 Employee 类来添加部门层次结构,并打印所有员工。
    组合模式

    步骤 1

    创建 Employee 类,该类带有 Employee 对象的列表。

    Employee.java

    public class Employee {
    
        private String name;
        private String dept;
        private int salary;
        private List<Employee> subordinates;
    
        public Employee(String name, String dept, int salary) {
            this.name = name;
            this.dept = dept;
            this.salary = salary;
            this.subordinates = new ArrayList<Employee>();
        }
    
        public void add(Employee e) {
            subordinates.add(e);
        }
    
        public void remove(Employee e) {
            subordinates.remove(e);
        }
    
        public List<Employee> getSubordinates() {
            return subordinates;
        }
    
        @Override
        public String toString() {
            return ("Employee :[ Name : " + name
                    + ", dept : " + dept + ", salary :"
                    + salary + " ]");
        }
    
    }
    

    步骤 2

    使用 Employee 类来创建和打印员工的层次结构。

    CompositePatternDemo.java

    public class CompositePatternDemo {
    
        public static void main(String[] args) {
            Employee CEO = new Employee("John", "CEO", 30000);
    
            Employee headSales = new Employee("Robert", "Head Sales", 20000);
    
            Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);
    
            Employee clerk1 = new Employee("Laura", "Marketing", 10000);
            Employee clerk2 = new Employee("Bob", "Marketing", 10000);
    
            Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
            Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);
    
            CEO.add(headSales);
            CEO.add(headMarketing);
    
            headSales.add(salesExecutive1);
            headSales.add(salesExecutive2);
    
            headMarketing.add(clerk1);
            headMarketing.add(clerk2);
    
            //打印该组织的所有员工
            System.out.println(CEO);
            for (Employee headEmployee : CEO.getSubordinates()) {
                System.out.println(headEmployee);
                for (Employee employee : headEmployee.getSubordinates()) {
                    System.out.println(employee);
                }
            }
        }
    
    }
    

    步骤 3

    验证输出。

    Employee :[ Name : John, dept : CEO, salary :30000 ]
    Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
    Employee :[ Name : Richard, dept : Sales, salary :10000 ]
    Employee :[ Name : Rob, dept : Sales, salary :10000 ]
    Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
    Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
    Employee :[ Name : Bob, dept : Marketing, salary :10000 ]
    
    展开全文
  • 排列组合 交叉组合 组合排列算法

    千次阅读 2018-06-19 11:41:31
    20180619一,交叉组合排列算法:1、前言:在项目开发的过程中负责全系统查询检索的一个模块,其中有一个查询方式叫做“交叉组合查询”,与数学中的排列组合类似,因此就开始想看一下这个该怎么写,以下为本人原创...
    20180619
    一,交叉组合排列算法:
    1、前言:
    在项目开发的过程中负责全系统查询检索的一个模块,其中有一个查询方式叫做“交叉组合查询”,与数学中的排列组合类似,因此就开始想看一下这个该怎么写,以下为本人原创文章,转载请标明出处:https://blog.csdn.net/RobinsStruggle,本人自定为java菜鸟,如有问题指出请指教,不胜感激!
    2、模型(例题):
    现有A、B、C三组球,每组数量不相同,需要在A、B、C中每组一次拿出一个球,拿出的不能与之前拿出的相等:
    A:a1、a2、a3;
    B:b1、b2;
    C:c1、c2、c3、c4;
    如果使用数学那么很快就可以得出结论,如果通过简单代码去实现这一步骤的话那么可用的代码为:
    public static void main(String[] args) {
    List<String> dataList4A = new ArrayList<String>();
    dataList4A.add("a1");
    dataList4A.add("a2");
    dataList4A.add("a3");

    List<String> dataList4B = new ArrayList<String>();
    dataList4B.add("b1");
    dataList4B.add("b2");

    List<String> dataList4C = new ArrayList<String>();
    dataList4C.add("c1");
    dataList4C.add("c2");
    dataList4C.add("c3");
    dataList4C.add("c4");

    for (String dataSon4A : dataList4A) {
    for (String dataSon4B : dataList4B) {
    for (String dataSon4C : dataList4C) {
    System.out.println(dataSon4A + dataSon4B + dataSon4C);
    }
    }
    }
    }
    3、扩展:
    上面的代码或者思维大概能够满足日常开发需求了,当时该想法还是不符合系统要求,因为系统查询条件的组数也就是说上个例子中球的组数是不确定的,那么如果使用上述的方法去实现的话似乎不太可能,而且极度不灵活,那么能不能开发一个工具类去进行根据传入的组数以及组数据去进行交叉排列组合呢?
    刚开始的时候我也是顺着前面所述的思路进行思考的,后来发现可行性不大,所以就开始慢慢摸索这个交叉排列组合的可编程化的规则,于是通过整理发现了一个规则,此处献上我的草稿:

    于是通过代码实现,并且封装成了工具类,就有了以下的代码:
    排列算法实体类:CombinationEntity.java

    排列算法操作类:CombinationPeration.java


    该两个算法文件可进行下载(想赚点C币哈哈哈哈,两个C币,望谅解!):https://download.csdn.net/download/robinsstruggle/10485775
    展开全文
  • 组合数学 —— 组合

    千次阅读 2019-03-23 16:36:39
    如果两个组合中,至少有一个元素不同,它们就被认为是不同的组合。 2.不可重组合数 所有不同组合的个数,叫做组合数,记作:或 由于每一种组合都可以扩展到 r!种排列,而总排列为 A(n,r) ,所以组合数 特别的,...

    【概念】

    1.组合

    从 n 个元素的集合 S 中,无序的选出 r 个元素,叫做 S 的一个 r 组合。

    如果两个组合中,至少有一个元素不同,它们就被认为是不同的组合。

    2.不可重组合数

    所有不同组合的个数,叫做组合数,记作:C_n^r 或 C(n,r)

    由于每一种组合都可以扩展到 r!种排列,而总排列为 A(n,r) ,所以组合数C_n ^r=\frac{A(n,r)}{r!}=\frac{n!}{r!(n-r)!},r\leqslant n

    特别的,C(n,0)=1

    3.可重复组合数

    从 n 个不同的元素中,无序的选出 r 个元素组成一个组合,且允许这 r 个元素重复使用,则称这样的组合为可重复组合。

    其组合数记为:H_n^r=C_{n+r-1}^r=\frac{n+r-1}{r!(n-1)!}

    4.不相邻组合数

    从 A={1,2,...,n} 中选取 m 个不相邻的组合,其组合数为:C_{n-m+1}^m

    例题:

    ① 一班有10名同学,二班有8名同学,现每个班级要选出2名学生参加一个座谈会,求有多少种选法?

    根据组合数与乘法原理,共有:C(10,2)*C(8,2)=1260 种

    ② 某班有10名同学,有4名女同学,现要选出3名学生,其中至少有一名女同学,求有多少种选法?

    根据组合数与加法原理,共有:C(4,1)*C(6,2)+C(4,2)*C(6,1)+C(4,3)*C(6,0)=60+36+4=100 种

    【组合数常用公式】

    1)C_n^m=C_n^{n-m}

    2)C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1}

    3)C_n^{m+1}=\frac{n-m}{m+1}*C_n^m

    4)(a+b)^n=\sum_{k=0}^nC_n^ka^{n-k}b^{k}(二项式定理)

    特殊展开:2^n=C_n^0+C_n^1+...+C_n^{n-1}+C_n^n

    5)C_n^m 为奇数时有 n&m=n 

    【求组合数的方法】

    首先 C(n,m) 的值一定是自然数,因为连续 m 个自然数的积一定被 m! 整除,因此求 C(n,m) 的值关键在于如何避免做除法。

    1.递归计算

    利用公式 C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1} 来递归的计算组合数

    LL cal(LL n,LL k){
        if(n<k||k==0)
            return 0;
        if(n==k||k==1)
            return 1;
        return cal(n-1,k-1)+k*cal(n-1,k);
    }
    int main(){
        LL n,k;
        cin>>n>>k;
        cout<<cal(n,k)<<endl;
        return 0;
    }

    2.杨辉三角打表

    利用公式 C_n^m=C_{n-1}^{m}+C_{n-1}^{m-1},将计算 C(n,r) 的过程化为加法来做,由于二项式展开系数的与杨辉三角一致,故该方法的实质就是求杨辉三角第 n 行,第 r 列上的数。

    int f[N][N];
    int main()
    {
        f[0][0]=1;
        for(int i=1;i<=N-1;i++)
            for(int j=1;j<=i+1;j++)
                f[i][j]=f[i-1][j]+f[i-1][j-1];
    
        int n,r;
        scanf("%d%d",&n,&r);
        printf("%d\n",f[n+1][r+1]);
    
        return 0;
    }

    3.公式化简打表

    C_n^{m+1}=\frac{n-m}{(m+1)}*C_n^m,由于除以 m,因此相对没那么容易越界

    int C[N];
    void calculate(int n,int m){//C[i]即为C(n,i)的值
        C[0]=1;
        for(int i=1;i<=n;i++)
            C[i]=C[i-1]*(n-i+1)/i;
    }
    

    4.约分求重数

    约分之后,分母即会变为 1,借此将除法化为乘法,约分方法是计算 1 到 n 之间的任意一个质数在 C(n,r) 的重数。

    具体做法是对分子分母上的每个数分解质因子,用一个数组 C[] 来记录重数,若分子上的数分解一个质因子 p,则 C[p]++,反之若分母上的数分解出质因子 p,则 C[p]--,最后将每个质因子按其重数连乘即可。

    将公式化为 C_n ^r=\frac{A(n,r)}{r!}=\frac{n!}{r!(n-r)!},通过直接计算质数 p 在 n! 中的重数而得到数组 C[],质数 p 在自然数 n 中的重数是指自然数 n 的质因数分解式质数 p 出现的次数,质数 p 在 n! 的重数为: n\:\:div\:\:p+n\:\:div\:\:p^2+n\:\:div\:\:p^3+...,根据公式:n\:\:div\:\:p^{k+1}=n\:\:div\:\:p^k\:\:div\:\:p,可以递推的求出 p 在 n!中的重数。

    例如:72=2*2*2*3*3,质数 2 在 72 的重数是 3,质数 3 在 72 的重数是 2;n=1000,p=3时,有 1000 div 3+1000 div 9+1000 div 27+1000 div 81+1000 div 243+1000 div 729=333+111+37+12+4+1=498,因此 1000!能被 3^498 整除,但不能被 3^499 整除,使用递推公式后,有:333 div 3=111 ,111 div 3=37,37 div 3=12,12 div 3=4,4 div 3=1

    程序实现时,先求出 1 到 n 间所有质数,再对每个质数求重数,从而计算从 n-r+1 到 n 的因子的重数与从 1 到 r 的因子的重数,前者减去后者,C[i] 中所存储的即为约分后质数因子的重数,再利用高精度加法,将答案存储,最后倒序输出即可。

    #include<cstdio>
    #include<cstring>
    #include<vector>
    const int N=30000;
    vector<int> prime,C;
    bool vis[N];
    int res[10];
    void Get_Prime()
    {
        memset(vis,true,sizeof(vis));
        for(int i=2;i<=N;i++)
        {
            if(vis[i])
            {
                prime.push_back(i);//存储质数
                C.push_back(0);//当前质数的重数为0
                for(int j=i*i;j<=N;j+=i)//筛除所有以i为因子的数
                    vis[j]=false;
            }
        }
    }
    void Add(int n,int p)//记录重数个数
    {
        for(int i=0;i<prime.size()&&prime[i]<=n;i++)
        {
            while(!(n%prime[i]))
            {
                n/=prime[i];
                C[i]+=p;
            }
        }
    }
    int main()
    {
        Get_Prime();//打表获取质数
    
        int n,r;
        scanf("%d%d",&n,&r);
    
        if(r>n-r)//根据公式C(n,r)=C(n,n-r)简化计算
            r=n-r;
    
        for(int i=0;i<r;i++)
        {
            Add(n-i,1);//将n-r+1到n的因子加到C中去
            Add(i+1,-1);//将1到r的因子从C中减去
        }
    
        memset(res,0,sizeof(res));
        res[0]=1;
        for(int i=0;i<prime.size();i++)//枚举所有质数
        {
            for(int j=0;j<C[i];j++)//枚举对应质数的重数
            {
                for(int k=0;k<10;k++)
                    res[k]*=prime[i];
                for(int k=0;k<10;k++)//高精存储答案
                {
                    if(k<9)
                        res[k+1]+=res[k]/10;
                    res[k]%=10;
                }
            }
        }
    
        for(int i=9;i>=0;i--)
            printf("%d",res[i]);
        printf("\n");
    
        return 0;
    }

    【例题】

    • Rooks(LightOJ-1005)(排列+组合)点击这里
    • Wall Painting(HDU-4810)(杨辉三角组合数打表+二进制枚举)点击这里
    • Combinations(POJ-1306)(公式化简法求组合数)点击这里
    • Binomial Showdown(POJ-2249)(公式化简法求组合数)点击这里
    • 集合的划分(信息学奥赛一本通-T1315)(递归法求组合数)点击这里
    展开全文
  • 浅谈UML中的聚合与组合

    万次阅读 多人点赞 2011-11-21 23:46:03
    大家都知道UML的类图中一般包含五种关系即 关联聚合组合泛化 依赖 有些人可能会感觉组合跟聚合有点难区分 说难其实是相对其他几种关系而言 实际上想分清这两种关系一点也不难 聚合跟组合其实都属于关联 只不过它们...

     

    大家都知道UML的类图中一般包含五种关系即  关联 聚合 组合 泛化 依赖  有些人可能会感觉组合跟聚合有点难区分 说难其实是相对其他几种关系而言 实际上想分清这两种关系一点也不难 

    聚合跟组合其实都属于关联 只不过它们是两种特殊的关联 因为本是同根生 所以它们之间难免会有相似之处 下面让我们一起来看一下它们之间有何不同

    聚合与组合的概念相信不用我在此赘述大家就已经了解了 下面直接上例子

    程老师的《大话》里举大那个大雁的例子很贴切 在此我就借用一下 大雁喜欢热闹害怕孤独 所以它们一直过着群居的生活 这样就有了雁群 每一只大雁都有自己的雁群 每个雁群都有好多大雁 大雁与雁群的这种关系就可以称之为聚合 另外每只大雁都有两只翅膀 大雁与雁翅的关系就叫做组合 有此可见 聚合的关系明显没有组合紧密 大雁不会因为它们的群主将雁群解散而无法生存 而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期

     

    聚合关系图:

    组合关系图:

     

    从从代码上看这两种关系的区别在于:

    构造函数不同

    雁群类:

        public  class GooseGroup
        {
            public Goose goose;
    
            public GooseGroup(Goose goose)
            {
                this.goose = goose;
            }
        }

    大雁类:

        public class Goose
        {
            public Wings wings;
    
            public Goose()
            {
                wings=new Wings();
            }
        }





    聚合关系的类里含有另一个类作为参数

    雁群类(GooseGroup)的构造函数中要用到大雁(Goose)作为参数把值传进来 大雁类(Goose)可以脱离雁群类而独立存在 

    组合关系的类里含有另一个类的实例化

    大雁类(Goose)在实例化之前 一定要先实例化翅膀类(Wings) 两个类紧密耦合在一起 它们有相同的生命周期 翅膀类(Wings)不可以脱离大雁类(Goose)而独立存在

    信息的封装性不同

    在聚合关系中,客户端可以同时了解雁群类和大雁类,因为他们都是独立的

    而在组合关系中,客户端只认识大雁类,根本就不知道翅膀类的存在,因为翅膀类被严密的封装在大雁类中。

     

     

     

    价值58元的专栏限时免费领取Spring Boot 趣味私房课


     

     

     

    展开全文
  • python 实现组合以及全组合

    万次阅读 2018-07-03 22:36:02
    数学中的组合概念是:从 n 个元素中不放回的取出 m 个元素组成一个组合(不考虑顺序),组合数是所有可能产生的组合的种数本列通过 26 个小写字母来演示组合的代码如下:def combination_k(s, k):  '''  字符...
  • Java计算组合数以及生成组合排列

    千次阅读 2018-11-24 00:28:29
    组合数计算 公式法 逐个相除法(错误) 逐个相除法修正版 素数幂乘法 基本公式法 平方差连乘法 组合恒等法 简单递归法 杨辉三角法 杨辉三角优化法 二进制法 组合数计算小结 获取数组的组合排列 二进制法...
  • 波段组合批处理 Landsat波段组合 加载需要处理的影像 选择波段组合顺序 点击“处理”按钮,等待处理完成 Sentinel-2波段组合 加载数据 选择波段组合顺序 点击“处理”按钮,等待处理完成 珠海一号辐射定标...
  • 组合问题

    万次阅读 2019-03-22 21:46:02
    组合 如果不是求字符的所有排列,而是求字符的所有组合应该怎么办呢?还是输入三个字符 a、b、c,则它们的组合有abcabacbcabc。当然我们还是可以借鉴全排列的思路,利用问题分解的思路,最终用递归解决。不过这里...
  • 捕获组合键 键盘组合

    千次阅读 2017-12-24 11:33:54
    捕获组合键 键盘组合键 VC++
  • 组合实体模式

    千次阅读 2019-09-25 20:05:20
    组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理...
  • 实际开发中,基本都是组合多条件查询。elasticsearch提供bool来实现这种需求; 主要参数: must:文档 必须 匹配这些条件才能被包含进来。 must_not:文档 必须不 匹配这些条件才能被包含进来。 should:如果...
  • python 写 组合两两组合

    千次阅读 2019-01-16 16:39:00
    紧挨着 组合 a b c d ----> ab ,bc ,cd portList = ['a', 'b', 'c', 'd'] for i, p in enumerate(portList): if i == len(portList) - 1: break # p, portList[i + 1] print ...
  • 组合索引

    千次阅读 2018-08-06 11:15:50
    组合索引.顾名思义.既不同于单列索引。  它是组合一个多列的索引。也可以称为多列索引。    以下会讲到几个关键点:(1).组合索引的顺序 (2).组合索引的生效(左前缀原则)  1.先生成一张没有索引的表    2...
  • 差价组合主要有牛市差价、熊市差价和蝶式差价等,差期组合应用的最多的是正向差期组合,混合组合主要有跨式、宽跨式、条式和带式等,投资者需要根据自身的预期以及成本要求等来选择。
  • C++ 组合模式

    千次阅读 热门讨论 2017-05-05 20:01:41
    组合模式对单个对象(即:叶子构件)和组合对象(即:容器构件)的使用具有一致性,组合模式又被称为“整体-部分”(Part-Whole)模式,属于对象结构型模式。 简述 模式结构 透明组合模式和安全组合模式 优缺点 ...
  • 1.3什么是组合特征?如何处理高维组合特征?

    千次阅读 多人点赞 2020-06-15 23:43:19
    03 高维组合特征的处理 知识点 组合特征 问题 什么是组合特征?如何处理高维组合特征? 分析与解答 为了提高复杂关系的拟合能力,在特征工程中经常会把一阶离散特征两两组 合,构成高阶组合特征。以广告点击预估...
  • 组合数学-排列组合整理

    千次阅读 2017-05-15 14:26:36
    此文是我整理组合数学排列组合知识的博文,排列组合从零开始。。。加油! 1.重复组合: 从n种不同元素中取出m的元素(方法是从n个元素中每次取出一个后,放回,再取另外一个,直到取出m个元素),每一种元素不...
  • 组合数学 排列组合基本问题总结

    千次阅读 2018-11-15 21:59:51
    1. 从n个不同元素中允许重复地选取r个元素的组合数是C(n+r-1,r)  证明思路:采用划归转化的思想,将可重组合转化为无重组合,证明的一般思路:  1. 先设出一组有序序列  2. 对该序列进行变换  3. 将变换后的...
  • <代码已经过期,其中爬虫链接已经失效> 一:马科维茨投资组合理论 投资组合(Portfolio)...投资组合理论[1]:若干种证券组成的投资组合,其收益是这些证券收益的加权平均数,但是其风险不是这些证券风险的...
  • 组合导航(八):INS/GPS组合导航

    千次阅读 多人点赞 2020-05-14 23:37:53
    INS/GPS组合导航1 误差反馈1.1 开环INS/GPS架构1.2 闭环INS/GPS架构2 组合导航的类型2.1 松耦合 的INS/GPS组合导航2.2 紧耦合 的INS/GPS组合导航2.3 深度耦合的 INS/GPS组合导航3 INS方程的动态误差模型4 松耦合的...
  • JAVA组合模式

    万次阅读 多人点赞 2018-08-24 00:11:06
    JAVA组合模式 通过本文将学习到 Table of Contents 1、组合模式的概念 2、组合模式的UML图 3、组合模式的实现 4、组合模式的优缺点 5、组合模式适用场景 6、总结 7、关于最近一些事。   红色代表重点,...
  • 字符串 abcd 要求输出组合为 a ab abc abcd b bc bcd c cd d 能有不连续的情况出现 如何解决
  • PPT基础(六)组合与取消组合

    千次阅读 2018-12-18 20:21:49
    组合 选中(框选/点选) 想要组合的图片和文字等 鼠标右键 组合(G)-&gt;组合(G) 组合的快捷方式:Ctrl + G 取消组合组合的图片或文字处 鼠标右键 组合(G)-&gt;取消组合(U) 取消组合的快捷方式:Ctrl + ...
  • 组合逻辑电路

    千次阅读 2019-04-11 15:28:30
    组合逻辑电路分析 组合逻辑电路的设计 组合逻辑电路中的竞争冒险 若干典型的组合逻辑电路 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 358,638
精华内容 143,455
关键字:

组合