需要有关信用到期算法的帮助

时间:2010-07-07 22:21:12

标签: algorithm language-agnostic

所以我被困住了。我正在制定一个到期的信用系统。与信用卡里程类似但不完全相同。顺便说一句,我为前面的书感到抱歉,但我需要添加足够的细节来帮助全面了解。

我需要的是一个用户为进行活动而累积学分的系统。但他们也可以将这些学分用于活动。如果不使用,则学分将在30天后到期。我似乎被困在如何在每晚运行的批次中准确计算出来。任何语言的任何想法都会受到高度赞赏,因为我似乎只是抓住了一个我无法解决的小细节。以下是数据示例:

7/1:+5 - 用户注册
7/2:+5 - 用户与系统进行交互
7/2:-3 - 用户购买活动
7/3:+5 - 用户与系统进行交互

所以在这一点上,用户已经获得了15个学分,并且已经花了3个学分。总共12学分。 (至少我得到了基本的数学:P)

我应该补充一点,目前我们正在尝试拥有两个字段:上次处理,下次处理。因此,假设这是一个新的注册,这个值是:

上次处理日期:7/1
下一个处理日期:8/1

所以现在8/1来了。批次开始并查看超过30天的所有信用。此时此刻是5。

这就是它开始模糊的地方。

然后,系统应该查看过去30天内花费的所有积分,看看他们是否正在使用任何积分。因为它们只有在未被使用时才会过期。所以有3个。所以我然后扣除用户2个学分,因为这是30天以上的学分和花费的差额。所以我完成批处理并相应地设置第二天的日期。现在假设他们已经没有花费我了,我开始计算超过30岁的积分,这是5和积分花费再次是3.但我显然不想考虑我昨天考虑的3个学分。不再考虑这3个学分的好方法是什么。

这就是我被困住的地方。

我们正在考虑为过期的积分编写借记记录,以便我们可以跟踪它们,但很难看到我如何在此计算中使用它。

如果你读到这里,谢谢你。如果你甚至在答案上做了一些努力,我至少会给你一个投票的努力。

编辑:
好的@Greg提到了我忘了解决的问题。考虑信用标志的想法。由于以下情况,有效点但不能正常工作:

假设用户在某一天花费10个学分。但是批次考虑的过期积分只累积到5个。那么他还应该剩下5个积分才能没有过期,因为他花了不止一次到期。所以这面旗帜不起作用,因为我们会跳过这5个额外的积分。希望有道理吗?

7 个答案:

答案 0 :(得分:3)

我不会考虑在您呈现数据时尝试处理数据。相反,您应该跟踪用户拥有的积分数以及过期时间。通过这种方式,您可以跟踪购买时使用的信用额度,而不是稍后尝试全部工作。

因此,当用户注册时,他们有:

5 credits expiring on 8/1

第二天与系统交互后:

5 credits expiring on 8/1
5 credits expiring on 8/2

购买后:

2 credits expiring on 8/1
5 credits expiring on 8/2

等等。

答案 1 :(得分:3)

对于系统的每个用户都保留一个数组,该数组存储有关用户在接下来的30天内可用信用额的信息

例如,某些用户的数据可能如下所示

8  | 
7  | | 
6  | | | | 
5  | | | | | | | | | | |
4  | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | 
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

每次用户获得一些积分时,您都会根据获得的积分数增加所有天数。例如,如果用户获得2个学分,则表格如下变化。就像升起整个图表一样。

10 | 
9  | | 
8  | | | | 
7  | | | | | | | | | | |
6  | | | | | | | | | | | | | | | | |
5  | | | | | | | | | | | | | | | | | | | | | | | | 
4  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

如果用户今天有x个积分并且花费y个积分,那么您将可用的积分减少到x - y,因为他每天的积分大于x - y。他的日子不超过x - y,数量保持不变。这就像切断图表的顶部。例如,如果用户花费3个学分,则图表将更改为

7  | | | | | | | | | | |
6  | | | | | | | | | | | | | | | | |
5  | | | | | | | | | | | | | | | | | | | | | | | | 
4  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

每天您将图表向左移动以模拟到期信用额度。明天用户将拥有以下金额

7  | | | | | | | | | |
6  | | | | | | | | | | | | | | | |
5  | | | | | | | | | | | | | | | | | | | | | | | 
4  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
3  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
2  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
1  | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
  -------------------------------------------------------------
  | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
   ^ ^                           ^          
   |  \_                         |
  today tomorrow             in 15 days

答案 2 :(得分:2)

假设您每天都运行此批处理,您可以拥有一个表格来跟踪他们获得的所有学分以及他们使用的学分(负学分)。

在下个月初,您的工作只是找出第一天赚取的哪些积分未在该月内支出。

第一天赚取的积分数 - 上个月他们花的所有积分。如果数字是正数,则他们有一些需要过期的积分。如此简单,在表格中添加一个负面信用记录。这将使未使用的信用额归零。

第二天,通过查看他们在第二天获得的积分减去他们在上个月获得的所有积分的总和,重复该过程,同时考虑您在前一天创建的负积分的记录。

答案 3 :(得分:1)

如何在支出上添加标志?如果未设置该标志,则可以根据需要在批次中包括该支出。如果您确实使用支出来抵消到期,那么您可以设置标志。下次通过时,你将忽略该支出,因为标志已经设定。

答案 4 :(得分:1)

使用借记记录记录正常支出。当月度批处理作业运行时,它可以计算小于或等于到期信用的总借方。如果有信用证到期,只需在您的申请中插入适当的借记记录(适当的==以取消超出部分)。通过这种方式,任何仅检查点数和借方的“运行总计”代码将达到批量代码所需的相同余额。

答案 5 :(得分:0)

解决此问题的一种方法是仅存储交易,而不是余额。然后,您总是在需要时实时计算余额。这是数据:

Date : Amount : Expiries
7/1 : +5 : 7/31
7/2 : +5 : 8/1
7/2 : -3 : never
7/3 : +5 : 8/2

任何时候的余额只是尚未到期的所有交易的总和。无需运行任何批处理。

答案 6 :(得分:0)

关于Julians的答复(我还不能评论),我正在处理同样的问题而且Julian方法不起作用,因为这会导致帐户变为负数。

如果用户未使用该服务一个月,则在8/4,帐户余额为-3,一个活动价值为5将使余额为2,而不是应该为5。