24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1311  |  回复: 11

rainbowguy

银虫 (正式写手)


[交流] 【求助】关于未知树状结构存储的问题?请大虾指教!

动态变化演变的数值,这些数值的动态演化、变化过程符合树状的发展,因此我想用树状结构存储这些动态变化演变的数值。但是无法预知整棵树的变化情况,包括树到底有多少层,父树结点有多少个子树结点(但子树结点<8)等。
我的问题是:
(1)这个动态变化、演变的数值(与时间步长有关系)怎样用树状结构实时存储?
(2)如果无法用树状结构去实时存储这些数值,那有没有更好的一种方式去存储这些数值?注:这些数值的演变、动态变化是符合树结构的演化的,即父生子、子生孙的演变关系。

请大虾指教!
回复此楼

» 猜你喜欢

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


★ ★
微尘、梦想(金币+2): 谢谢回复…… 2011-04-03 17:55:23
树状结构显然可以存储啊,无非就是一堆指针指来指去...
2楼2011-04-02 16:45:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rainbowguy

银虫 (正式写手)


引用回帖:
Originally posted by sudo at 2011-04-02 16:45:40:
树状结构显然可以存储啊,无非就是一堆指针指来指去...

大虾没明白我的意思,这是动态变化的树,你不知道树的具体结构,但是要存储它,怎么办?
3楼2011-04-02 17:14:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


引用回帖:
Originally posted by rainbowguy at 2011-04-02 17:14:00:
大虾没明白我的意思,这是动态变化的树,你不知道树的具体结构,但是要存储它,怎么办?

呃,虽然树的具体结构不知道,不过,每个节点的结构可以定下来(根据你的描述,不知道我理解是否正确)

struct node{
    int value;
    struct node* pchild[8];
}

然后像创建树根节点,插入子节点什么的,都可以用树的相关算法实现啊...

不知道你的具体需求是什么?
4楼2011-04-02 17:24:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rainbowguy

银虫 (正式写手)


引用回帖:
Originally posted by sudo at 2011-04-02 17:24:14:
呃,虽然树的具体结构不知道,不过,每个节点的结构可以定下来(根据你的描述,不知道我理解是否正确)

struct node{
    int value;
    struct node* pchild[8];
}

然后像创建树根节点,插入子节点什 ...

子结点的个数未知、树的层数未知,树最后怎么发展也未知,
在一切未知的情况下怎么去实时存储?
你提到的那个只是静态的,当然很好实现。
5楼2011-04-03 08:51:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


那个struct node是“树的一个节点的结构”

至于怎么构造你那个树,显然是动态申请

楼主应该先明确一下接口是什么,比如,插入一个节点的时候,是根据什么信息插入的(举个例子,比如,根据层数和父节点,又比如,根据唯一的父节点ID)。然后以这个简单的struct node结构,不断动态申请内存构造你所需的树

PS:莫非是我没有理解你的意思?还是你没有理解我的意思?像最简单的链表这种东西的动态性,楼主应该是理解的吧

[ Last edited by sudo on 2011-4-3 at 10:25 ]
6楼2011-04-03 10:24:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rainbowguy

银虫 (正式写手)


引用回帖:
Originally posted by sudo at 2011-04-03 10:24:10:
那个struct node是“树的一个节点的结构”

至于怎么构造你那个树,显然是动态申请

楼主应该先明确一下接口是什么,比如,插入一个节点的时候,是根据什么信息插入的(举个例子,比如,根据层数和父节点,又 ...

你是真没明白我的意思,呵呵
你说的那种在最初的数据结构中都有,我说的是这颗树会随时间而不断发生变化,怎么办?原来的那种从根本上解决不了的
7楼2011-04-03 11:12:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


rainbowguy(金币+5): 2011-04-03 18:41:34
引用回帖:
Originally posted by rainbowguy at 2011-04-03 11:12:07:
你是真没明白我的意思,呵呵
你说的那种在最初的数据结构中都有,我说的是这颗树会随时间而不断发生变化,怎么办?原来的那种从根本上解决不了的

你指的是,比如说,有两个节点原来是父子节点,变化后就可能不是父子节点了,是这个意思?
8楼2011-04-03 11:14:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★
微尘、梦想(金币+2): 谢谢回复…… 2011-04-03 17:55:51
那就每个节点多留几个指向别的节点的指针,
这样就可以记录(随时间或者步骤)变化的情况了。

例如,
pOrigin,
pModify,
pLatest,
pCurrent
等等。
9楼2011-04-03 12:03:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rainbowguy

银虫 (正式写手)


引用回帖:
Originally posted by sudo at 2011-04-03 11:14:44:
你指的是,比如说,有两个节点原来是父子节点,变化后就可能不是父子节点了,是这个意思?

可能是我的表述有问题,没有说清楚。
举个例子,比如一个符合树状结构的系列数值(如身高),这些数值对象具有这种父子结构,但这些数值(身高)具体是多少是提前未知的,当然我们也不可能提前知道。一个父(父亲)数值(身高)有几个子(儿子)数值(身高)也是未知的,就是这样一代一代繁衍下去;同时,这个繁衍过程还满足以下三个假设条件:
(1)一个父亲最多有8个儿子;但如果满足条件T,则这个父亲会没有儿子;
(2)每个人的身高是他上一代的父亲身高的一个函数,如果知道上一代他父亲的身高,就可以计算出他儿子的身高;
(3)每个人的生育下一代(即有儿子)的时间与这个人的身高有关,我们姑且假设认为身高越高,那他吸引异性能力越大,结婚也就越早,生育下一代孩子的时间也就越早,即有下一代的时间间隔越短。我们根据这个人的身高可以计算出生育下一代的时间间隔。
当时间过了1000年后,这个家族的图谱及其中每个人的身高怎样去描述和存储?总不能先设定一个树状结构吧,因为你不知道这个树状结构有多少层,其中每一层中每个父亲有几个儿子。只有当你知道了上一层父亲的身高时,才能知道儿子的身高,也才能知道从父亲到儿子的时间间隔;也就是说,只有你知道了上一层的确切数值后,才能知道下一层的确认数值,但是在程序中是无法实现的,总不能这样吧:
for(int i=1;i<上一代父亲所生儿子数;i++)
{
   ..........//计算这一代身高、每代时间、有几个儿子;
   for(int j=1;j<上一代父亲所生儿子数;j++)
   {
     ..........//计算这一代身高、每代时间、有几个儿子;
     for()
     {..........//计算这一代身高、每代时间、有几个儿子;
     }
   }
}
上述这种是无法用代码实现,因为你不知道有多少代,即在程序中你不知道要写多少个for循环。
这样不知道说清楚了没有?这样怎样进行计算模拟?

[ Last edited by rainbowguy on 2011-4-3 at 18:56 ]
10楼2011-04-03 18:20:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)


rainbowguy(金币+40): 2011-04-06 11:56:33
引用回帖:
Originally posted by rainbowguy at 2011-04-03 18:20:42:
可能是我的表述有问题,没有说清楚。
举个例子,比如一个符合树状结构的系列数值(如身高),这些数值对象具有这种父子结构,但这些数值(身高)具体是多少是提前未知的,当然我们也不可能提前知道。一个父( ...

CODE:
typedef struct _NODE{
        int height;
        int age;
        bool isAlive;        //是否活着
        int childNum;        //当前孩子数量
        struct _node* pchild[8];
}NODE, PNODE;

PNODE root = new NODE;

...        //初始化root的一些语句,pchild[i]==NULL则表示没有孩子

int year = 0;

while(year<设定值){                                //仿真退出的条件,可以是其它
        traverse(root, year);                //从root开始,对整棵树的节点进行遍历
        year++;
}

...        //这个时候,经过year的整棵树就出来了


整个算法的关键自然是在树的遍历函数void traverse(PNODE r, int year)上,这个随便一本算法书或者数据结构书都应该有讲的...随手写个例子吧:

void traverse(PNODE r, int year){
        if(r == NULL) return;
       
        r->height = f1(year); //身高是year的函数
        r->age = f2(year);     //年龄是year的函数
        r->isAlive = f3(year); //是否活着也是year的函数
       
        for(int i=0; i<8; i++){ //遍历孩子
                if(f4(r->height, year)){ //是否在year生孩子?按你说的,跟身高有关系
                        r->pchild[r->childNum] = new NODE;
                       
                        r->pchild[r->childNum]->height = f5(r->height); //初始化孩子状态
                        ...
                       
                        r->childNum++;
                }
               
                traverse(r->pchild[i], year);        //注意!递归深入同理处理孩子节点
        }
}

上面的f1()到f4()这些函数,按照一般仿真习惯,自然里面包含一些随机函数,就不多说了。另外,上面的程序属于“深度优先遍历”的方法。

总而言之,楼主需要拿一本数据结构的书,好好复习一下=,=

[ Last edited by sudo on 2011-4-3 at 19:33 ]
11楼2011-04-03 19:22:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
rainbowguy(金币+5): 2011-04-06 11:56:38
这不是循环,而是遍历,可以代码实现。
12楼2011-04-04 00:16:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 rainbowguy 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见