CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

这个算法怎么实现???谢谢!!100分!!着急!!!

楼主wangqiu(白菜帮总瓢靶子)2006-07-27 16:36:36 在 专题开发/技术/项目 / 数据结构与算法 提问

 
   
          在事先知道性别的情况下,A   B   C   D   E是五个人,他们是一家人,A是B的丈夫,A是C和D的父亲,A是E的儿子,这里都是以A为基点,怎么样通过算法,我们知道以E为基点的时候,E是A的母亲,E是B的母亲,E是C和D的奶奶;又怎样知道以C为基点,C是A和B的儿子,C是E的孙子,C是D的兄弟\  
   
          或者在不写程序的时候,可以通过数据库的表结构实现???  
   
   
          不知道说没说清楚,请大家指教,谢谢!!  
   
   
           
   
  问题点数:100、回复次数:26Top

1 楼def000()回复于 2006-07-28 00:43:33 得分 0

数据库好像叫做存储过程?  
   
  比如你用下面的类表示人  
  class   person  
  {  
          person*               m_spouse;  
          list<person*>   m_parents;  
          list<person*>   m_children;  
           
          //结婚  
          void   Marry(person*   spouse)  
        {  
              m_spouse   =   spouse;   spouse->m_spouse   =   this;  
   
              //   你的父母和他的父母都是你们的父母  
              m_parents   =   m_parents   +   spouse->m_parents;    
              m_spouse->m_parents   =   m_parents;  
   
              //   你的孩子和他的孩子都是你们的孩子  
              m_children   =   m_children   +   spouse->m_childern  
              m_spouse->m_children   =   m_children;  
   
              //   这样你和你配偶的就都搞定了,还得更新你们所有孩子和父母的相应的关系。。。  
              //   太多了。  
        }  
  };Top

2 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 08:36:40 得分 0

这个好象不行,还有更好的吗??  
   
  各位大哥!!!Top

3 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 08:41:08 得分 0

请强人指教Top

4 楼AFIC(A Fool In China)回复于 2006-07-28 09:44:10 得分 0

一看你的例子就坐不出来,  
  你说:A是B的丈夫,A是E的儿子,E是B的母亲  
  你这里存在近亲结婚了,这就存在双重人际关系了,  
  ab是夫妻也是兄妹,b是e的女儿兼儿媳妇  
  这不是算法能解决的了,如果多重近亲结婚肯定是死循环。  
   
  如果是你笔误那么以小家庭为单位建立一个id,  
  并记录其双亲家庭的id,  
  然后再加上一个家庭中的辈分,  
  利用oracle特有的connect   with查询一下基本上就可以搞定。Top

5 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 10:59:22 得分 0

大哥,那就叫婆婆吧,E是B的婆婆  
   
   
  能不能说的细一点Top

6 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 11:00:16 得分 0

能不能不用ORACLE  
   
  用代码能实现吗Top

7 楼wood87654321(wood87654321)回复于 2006-07-28 15:15:26 得分 0

你的问题条件是特定的?也就是说肯定针对那5个人以及那样固定的关系?  
  还是可扩展的?也就是说算法在新增加姐妹、舅舅等等情况下也要适用?Top

8 楼AFIC(A Fool In China)回复于 2006-07-28 16:01:05 得分 0

你首先要存放你已知的信息对巴,  
  就按我说的建表结构,  
  id/homeid/phomeid/level  
  比如a  
  a/1/0/2  
  b/1/0/2  
  c/2/1/1  
  d/3/1/1  
  e/0/x/3  
  这就是你例子的数据  
  第一个id就是名字  
  第二个根据家庭的不同,我随便递增的  
  第三是父母家庭id,  
  e是a的母亲,e的家庭id是0,所以a的phomeid也是0  
  这样你的数据就穿起来了。  
  第四个表示辈分,e最老是3,其次是ab,是2。  
  当你想知道,C为基点,C是A的什么的时候,  
  先看辈分,a大,差距是1,你就直接取出c的phomeid,  
  有亲子关系自然家庭号相同,否则没关系。  
  这不是很自然,很简单吗?  
  不过辈分差距不是1的时候你就要循环操作了。Top

9 楼wangqiu(白菜帮总瓢靶子)回复于 2006-07-28 19:35:10 得分 0

当然不是特定的,要扩展  
   
  不过,一些太特殊的我们可以归为其他亲戚就好了  
   
  常用的是必须的Top

10 楼cxt460()回复于 2006-07-28 22:02:32 得分 0

AFIC感觉还是有一点小瑕疵也Top

11 楼wood87654321(wood87654321)回复于 2006-07-31 09:24:56 得分 0

用表结构是比较现实的方法,但是由于条件是可扩展的,所以建立数据结构时,必须事先建立所有要用亲戚之间的对应关系表。  
  AFIC(AFIC)的结构体现了辈分关系,但无法体现实际的亲缘关系,比如同一家庭上一辈,其究竟是父还是母?抑或是姑舅等“其他亲戚”?Top

12 楼AFIC(A Fool In China)回复于 2006-07-31 09:57:49 得分 0

我觉得可以实现就没写那么细而以……  
  他已经说了他有性别了阿。  
  姑舅肯定是他的phomeid的phomeid和姑舅的phomeid相同吧,  
  sorry,我不知道姑舅到底是什么亲戚……Top

13 楼chszs(老刀)回复于 2006-07-31 13:29:55 得分 0

建立树状结构最清晰。Top

14 楼DraculaW(成爲牛人,然後離開)回复于 2006-08-03 10:44:04 得分 0

樹狀結構     最好使用臨接矩陣   這樣子實現得最清晰Top

15 楼kingkiosk()回复于 2006-08-08 10:55:40 得分 0

其实复杂的问题可以拆成几个简单的问题  
  建立几个关系  
  1.个人资料           (编号,姓名,性别等)  
  2.夫妻关系的       (丈夫编号,妻子编号)  
  3.辈分关系的         (父母编号,儿女编号)  
  然后给他们编号,用编号做主键就连接成一个关系数据库.  
  找儿女通过数据库表3找,找孙子的话先在3找儿女,确定儿女号后再在3找一次儿女  
  找兄弟的话先找父(母)编号,然后通过父(母)找该父(母)名下所有子女,除掉你自己就是兄弟  
  找婆婆的话先找出配偶编号,通过找配偶的父母确定两个编号,然后在1确定性别知道是婆婆还是公公Top

16 楼kingkiosk()回复于 2006-08-08 14:20:37 得分 0

用数据结构的话  
  1.个人资料用结构体数组放  
  2.可以选用顺序表来放  
  3.可以通过关系画出一个森林,再转成二叉树存放Top

17 楼jammyxu()回复于 2006-08-08 14:38:08 得分 0

就五个字段搞定,其它用存储过程算  
   
  名字,性别,父,母,配偶Top

18 楼yyfhz(火山)回复于 2006-08-08 17:34:53 得分 0

定义所有需要用到的关系:  
  如  
  父,母,子,女,兄,弟,姐,妹,  
  祖父,祖母,外祖父,外祖母,  
  夫,妻,  
  岳父,岳母,公公,婆婆,...  
   
  找出其中最基本的关系,如  
  父,母,子,女,夫,兄,弟,姐,妹,  
   
  然后以这些基本关系来定义其他的关系  
  如  
  祖父=   父(父)  
  妻=   夫的反函数  
  岳母=母(妻)=母(夫的反函数)  
  ...  
   
  然后将关系树中的任意两点都用这种基本关系的叠加来表示出来,再通过这些关系式转换即可。Top

19 楼kingkiosk()回复于 2006-08-09 00:47:40 得分 0

反函数?Top

20 楼kingkiosk()回复于 2006-08-09 01:02:17 得分 0

这样吧  
  用一个一维数组表示人名  
  A[][2]={(父亲名,男),(母亲名,女),(老婆名,女),(姐姐名,女),...}  
  A数组的行标当做这个人的编号,  
   
  用一个二维数组定义夫妻关系  
  S[][2]={(编号1,编号2),(编号3,编号4),...}  
  如:姐姐编号是3,姐夫编号是8  
  那么  
  S[0][0]=3;S[0][1]=8  
  同一行标的人为夫妻,也就是说通过扫描这个二维数组就可以知道所有的夫妻关系  
   
  用一棵二叉树表示辈分和兄弟姐妹关系,关系规则:左孩子右兄弟(姐妹)  
                                                    父亲  
                        我                                                               叔叔  
      我儿子                       我弟弟           叔叔的孩子1                                 伯伯  
            我女儿     弟弟的孩子                           叔叔的孩子2     伯伯的孩子Top

21 楼yyfhz(火山)回复于 2006-08-09 09:25:22 得分 0

可以用图来表示最基本成员关系,在连线上记录2个成员之间的关系。  
  如  
                                          夫                                                                               妻  
                                          |------------------------------------------|  
                                          |                                                                                     |  
        父                       子     |父                     子           子                                       母|     女                 父  
  AA'---------------   A   ---------------   C   ------------------------   B   -------------BA'  
    夫|                             |   |                           兄   |                                                   |   |                             |夫  
    妻|                             |   |                                 |                                                   |   |                             |妻  
  AB'---------------|   |                                 |                                                   |   |-------------BB'  
        母                       子     |                           妹   |                                                   |     女                   母  
                                          |---------------   D   ------------------------|  
                                          |父                       女   |   女                                         母|  
                                          |                                 |姐                                               |  
                                          |                                 |                                                   |  
                                          |                                 |                                                   |  
                                          |                                 |弟                                               |  
                                          |---------------   E   ------------------------|  
                                            父                       子       子                                         母  
  对于任意2个成员,找出它们之间的最短路径,  
  然后可以根据间接关系的推导公式求出各个成员之间的关系。  
  Top

22 楼jammyxu()回复于 2006-08-09 14:08:21 得分 0

其实只要表示一代直系亲属关系就好了,多了反而更复杂  
   
  所以我只用五个字段,但考虑到夫妻有离婚的问题,加一个婚姻表,即一个子女表,一个婚姻表:  
  表一:  
  名字,性别,父,母  
  表二:  
  男方名,女方名,离婚否(靠!加个索引的话,一夫多妻,二奶都好表示!)  
   
  你的兄弟姐妹:查询你同一个父亲或同一个母亲的人(可查同父异母或同母异父,同父同母则将或改为与)  
  你的奶奶:查询你父亲的母亲  
  你的岳母(婆婆):查询你配偶的母亲,考虑离婚情况:你子女的外婆(奶奶),同名过小滤一下  
   
  任何血綠关系都逃不出以上关系。结拜,收养关系当然不算血綠关系了  
   
  Top

23 楼kingkiosk()回复于 2006-08-09 17:13:47 得分 0

楼上你给那是在关系数据库上实现的  
  现在要的是数据结构的算法Top

24 楼yelling(Ray(←☆→射手))回复于 2006-08-10 14:29:11 得分 0

其实只需要建一个合理的数据结构就可以了。  
   
  一种设想是:  
  可以引用二叉树的结构,父亲为根节点,子女位子节点,可以建好一棵二叉树,然后,父亲和母亲之间有一个双向指针,用来模拟夫妻关系。  
  这种模型的问题是,碰到离过婚的话,就不好处理,但是在数据结构上较简单。  
   
  另一种方法是:  
  每一个节点有两个父节点,就是父亲和母亲,这样的模型能够处理上面的问题,但是建树和遍历树的时候比较麻烦。  
  暂时想到两种,只是原型,没做优化。。。Top

25 楼kingkiosk()回复于 2006-08-10 23:14:25 得分 0

楼上的想法很好  
  其实只要树的数据域有两个字符串就行了Top

26 楼yelling(Ray(←☆→射手))回复于 2006-08-11 09:53:30 得分 0

那样不行的,因为,夫妻可以离婚再结的Top

相关问题

关键词

得分解答快速导航

  • 帖主:wangqiu

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo