免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1716 | 回复: 0
打印 上一主题 下一主题

[算法] 求助一个c++实现的自定义排序算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-04 13:27 |只看该作者 |倒序浏览
10可用积分
类似银行系统中的转账交易,a转到b,若a钱不够,需要先从a0转到a再做a到b,若a0没钱要先做a00转到a0再做a0转到a。。。
以上逻辑,拟用如下代码实现:
class Trans{
public:
  void check(T * t){}
};
class Acc{
public:
   int id;
   int grpid;
   double amt;
   int action;
};

为简单说明,首先,假定如下代码:
        T *a = new T();
        T *b = new T();
        a->id=1;a->grpid=1; a->amt=100.0; a->action=TAKE;
        b->id=2;b->grpid=1; b->amt=100.0;b->action=SAVE;     //a、b都属于转账组1,但有各自不同的id
之后
        Trans x,y;
        x.check(a);  //看看a能否转走100
        y.check(b);  //看看b能否转入100

在x.check()中,程序认为a钱不够,必须先做a0到a,而为了区分之前的a到b,所以a0到a需要用一个新的组号(假设是11)。同样:
        T *a0 = new T();
        a0->id=1;
        a0->grpid=11;
        a0->amt=100.0;
        a0->action=TAKE;

        T *as = new T();
        as->id=2;
        as->grpid=11;
        as->amt=100.0;
        as->action=SAVE;
        Trans_1 x1,y1;    //由于a0转到a的检查规则与a到b的不太一样,因此使用Trans的子类Trans_1
        x1.check(a0);
        y1.check(as);
同样,也许在x1.check()中要必须先做a00转到a0,因此类似过程会重复到程序认为钱足够,没有任何依赖关系为止。
上述过程对整个操作中的任何其它元素(包括生成的中间元素)也是如此。最终,会在原有的a、b之外,生成各自依赖的组串(注意,也许存在b中存入100后必须自动转到b0这个交易组)。
最后,上述所有数据形成一个vector<T *>,要按依赖关系将其排序,并从1起重新分配组号。在上述例子中,排序后组号应变成:
11 1...即必须先完成11才能完成1
重新分配组号后变为:
1,2....
目前的难点主要有如下:
如何分配新组号以体现依赖关系,并确保在一个依赖关系线中分配的组号不会与其它依赖关系线中的重复?
在分配了新组号后,应按如何规则排序才能显示各个组的依赖关系?

上述类迫不得已下可以做少许更改,但最好只改一两个字段。

这样的问题,大家能否给个思路?有范例代码当然更好。谢谢!

[ 本帖最后由 jchc 于 2009-1-4 13:32 编辑 ]

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP