2

假设我们正在为客户生成优惠券——每张优惠券都有一个 ID 和到期日期,我们想设计一个程序让客户领取他们的优惠券。特别是我们不打算使用任何支持数据库,但需要具有处理数百万优惠券的可扩展性 - 关键逻辑应该防止优惠券被两次索取

首先,我试图了解维持优惠券状态的最佳数据结构,即它是否已被声明-我知道有位图、哈希图、b-tree 之类的选项-我想了解哪个是最佳的

4

3 回答 3

1

没有存储机制是不可能做这样的事情的。您需要一个验证优惠券代码的算法。使用后,您需要在数据库中为该优惠券代码设置一个标志,这样任何人都不能使用同一张优惠券两次。

所以表结构将类似于:

表优惠券

优惠券代码:nvarchar(80)
已使用:位
到期日期:日期时间

于 2012-04-15T05:01:52.220 回答
0

你能维护两个文件吗?在第一个文件中,创建所有将在每一天到期的优惠券 ID 的倒排索引。所以你会有这样的东西 {mm/dd/yyyy:[ products which will expire on this mm/dd/yyyy]...}(所以这就像键/值对,其中 value 是一个列表。第二个是字典,您可以在其中拥有一个 hashmap,其中 coupon_id 作为键,布尔值作为值,指示您的优惠券是否已售出。

并且您每天根据第一个映射的触发响应更新您的第二个哈希映射。所以像这样的东西..

hashmap 1 :{ Today_date:[1234,2345,42234]....tomorrows date:[43225,2508502..]}

所以这表明哪些优惠券将在今天和明天到期......等等

hashamp 2:{ 1234:1, 2345:0....}

1 可能意味着优惠券已售出..

但是在今天日期过去之后..您返回产品 [1234,2345,42234...] 因为这些是设置为过期的优惠券..并且在 hashmap2 中:将具有“0”作为其价值的优惠券的价值设置为是-1或其他东西..意味着它们不再可用..所以在hashmap 2中只有具有0值的优惠券ID可用..??

于 2012-04-15T05:30:11.667 回答
0

我在想这样的事情 - 生成一个优惠券ID,类似于(发行日期+到期日期+运行计数器(单独的系列1......每个发行/到期日期对的N)+校验和)然后有类似HashMap( ExpiryDate => HashMap ( IssueDate , BTree )) ... Btree 将存储与已领取的优惠券相对应的已领取计数器

在我的方法中,我们所做的是生成优惠券 id,以便在优惠券 id 中,我对优惠券发行日期和优惠券到期日和增量计数器值进行编码 - 1,2 ....N ,例如。优惠券 20120401-20120410-12345-XYZ ,然后我只维护在 BTree 中为每个发行日期/到期日期对声明的计数器 ...这个 Btree 而不是每个声明的计数器有 1 个数字,将存储一系列计数器值声称。每个问题/到期日期对将有 1 个 Btree。

但是这个 Btree 将每个节点作为 ( N1 , N2) ,其中 N1 <= N2 之间的所有数字都已被声明,如果它与任何现有节点不连续,我们将新节点插入到 btree 中,否则将其合并到现有节点,如果它是连续的并更新 N1 或 N2

于 2012-04-16T13:16:18.253 回答