业务描述:
1到n个对象,每两两存在一个是非关系(双向)。现求出所有最大不重复分组,其中分组当中的每两两元素关系为是的关系。业务抽象:
1到n个人,每两个人存在一个朋友关系(是或者否),求n人当中所有的不同的最大朋友圈(圈子当中随便两个人都是朋友)。实例:有8个人,他们的朋友关系如图(其中有边相连接表示互为朋友关系)那么所有的最大不重复朋友圈子为
{1,2,3,4}
{2,6,7}
{4,5}
{5,6}
{7,8}
{2,8}

本来{1,2,3}也是一个朋友圈,但是它是{1,2,3,4}的子集,所以排除{1,2,3}
oracle数据库设计
建表语句
/*==============================================================*/
/* DBMS name:      ORACLE Version 10g                           */
/* Created on:     2011/10/14 15:15:47                          */
/*==============================================================*/
DROP TABLE TEST CASCADE CONSTRAINTS;/*==============================================================*/
/* Table: TEST                                                  */
/*==============================================================*/
CREATE TABLE TEST  (
   USER_NAME            VARCHAR2(10),
   REF_USERNAME         VARCHAR2(10),
   RELATION             VARCHAR2(1)
);
插入数据
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','2','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','3','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','4','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','5','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','6','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','7','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','8','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('1','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','3','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','4','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','5','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','6','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','7','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','8','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('2','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','4','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','5','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','6','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','7','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','8','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('3','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('4','5','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('4','6','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('4','7','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('4','8','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('4','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('4','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('5','6','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('5','7','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('5','8','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('5','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('5','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('6','7','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('6','8','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('6','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('6','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('7','8','Y');
INSERT INTO test (user_name, ref_username, relation) VALUES ('7','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('7','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('8','9','N');
INSERT INTO test (user_name, ref_username, relation) VALUES ('8','10','N');
--------------------------------------------------------------------------
INSERT INTO test (user_name, ref_username, relation) VALUES ('9','10','N');

解决方案 »

  1.   

    第一个人 {0 1 1 1 0 0 0 1}
    第二个人 {1 0 1 1 0 1 1 0}
    第三个人 ***
    第八个人{}
    1表示Y,0表示N
     {0 1 1 1 0 0 0 1}
    表示xx和第一个人无关系,和第二个三个八个有关系
    这样就把向量都列出来了
    接着求极大非线性相关组就可以了
    数学模型建立完成了
    接下来就是程序了。
    先把向量搞成矩阵形式,用java模拟一下就出来这个难度不大。然后再把矩阵化成最简形式(方法可以去查高代书或者baidu)
    再把最简形式中所有非0向量拿出来,得到这些向量的位置(比如第一行的向量就是第一个人)
    那么这些非0向量就是你想要的结果