一个数据库问题的算法,请帮忙!(200分)

  • 主题发起人 主题发起人 raider
  • 开始时间 开始时间
R

raider

Unregistered / Unconfirmed
GUEST, unregistred user!
刚刚回来,就要麻烦大家了,我现在求解一算法,急,请帮忙!
现有一个数据库A 字段
商品编号 GdNum
数 量 GdCount
数据库 B 字段
买主编号 SelNum
商品编号1 GdNum1
商品编号2 GdNum2
商品编号3 GdNum3
........
商品编号10 GdNum10
随机号 radNum
选中标记 flag
现在问题是这样的,在数据库A中,存放这上百种商品的信息,
数量有限。每个买主有权在这些商品中选择10种,每种一个,
按照优先权填写,即GdNum1是买主最希望得到的,
GdNum2次之.....(随机号是填写时产生的)填入库B中。
但是每个买主最终只能买到一样商品。程序的功能就是根据
这两个库,以及随机号,为每个买主确定一个商品。要求尽量
满足最高愿望。最后,没有选中商品的顾客以及剩余的未卖
出的商品,重新发布,再次选择,重复上面的过程。
由于必须尽可能的满足买主的最高愿望,所以
现在我只想到用循环的方式,从GdNum1到GdNum10循环10次,
每次在根据库A中商品编号和数量,在B中找到合适的纪录,
设置flag标记。这样效率实在太差了!有上百种商品,数万
个客户,请大家帮忙看看有没有其他方法,或者提高效率的手段!
数据库结构也可以更改
BTW 用存储过程写好呢,还是在Delhi中实现好?(均运行在
服务器上)
 
"随机号"是干嘛的??? {B-(
 
因为同一种商品数量有限(比如200个),如果很多人(2000)同时选择这种
商品,我们根据填写时的由系统产生随机号来决定谁选中了该商品。可以根据
随机号排序,选择前200人。
 
存储过程最好!还要建立一数据库C:
买主编号
商品编号
在存储过程中完成所有算法,将结果插入到数据库C.至于好的算法,先看看其他网友的!!!
 
我觉得循环的次序是不是可以这样改一下
买主1的num1, 买组2的num1....... 买主n的 num1
然后
买主1的num2, 买组2的num2....... 买主n的 num2
先尽可能满足所有 第一要求, 然后才是其他要求
这样的总体的效用应该最大
(假定:任何人的第一要求的效用大于任何人第二要求满足
使得效用)
下面语句八满足第一要求的结果插入 c , 并更新a,b
insert into c(selnum,gdnum)
as select b.selnum, b.gdnum1 from b
where not(b.selnnum is null) and (b.flag=0)
exists(select * from a where a.gdnum=b.gdnum1 and a.gdcount>=1) ;
update b
set flag=1
where b.flag=0 and exists(select * from c where c.selnum=b.selnum) ;
update a
set gdcount=gdcount -
(select count(*) from b where b.flag=1 and a.gdnum= b.gdnum1 )
where exists(select * from b where a.selnum=b.selnum and b.flag=1)
主: flag 的值为要求的次序好, 1,2,3...10;
初始值为0.
反复执行上面语句, 并修改相应的gdnumN 即可.

 
要提高效率,循环肯定是不行的.
最好用一些人工智能的算法,比如广度,深度,动态规划等.
实现起来比较复杂,得用程序,存储过程恐怕不行.
 
对于前面的回答有一点问题,你的数据应该是逐渐添加的,而不是先有这么多的买家
再进行匹配的,逐步添加的话,可以使用STOREPROC,否则只能用程序做了。
 
hehe, 这么复杂,现在还有什么东西这么紧俏啊:-)
 
没什么特别好的办法。
 
是不是可以加入“填写时间”字段,记录用户申请某种
商品的时间,这样可以先按填写时间排序,然后读出
商品的数量,接下来 select top 商品的数量 用户 from 你的用户申请视图即
可,top 是sql 6.5/7.0的语法。即选出前面一定数量的记录。
 
多人接受答案了。
 
后退
顶部