|
|
下面是我写的python代码,还没测试过
- REQ_MAX = 1000 + 100
- REQ_MIN = 1000 - 100
- all_days = list(date_range(start, end))
- for day in all_days:
- midnight = datetime.datetime.combine(day, datetime.time(0))
- tomorrow = midnight + datetime.timedelta(days=1)
-
- c = count(midnight, tomorrow)
- count_map = [(midnight, tomorrow, c)]
-
- cur_order_count = 0
- while len(count_map) > 0:
- #find a good time period to process
- (start_time, end_time, count) = count_map.pop(0)
- while cur_order_count + count > REQ_MAX
- #split in half
- new_end_time = start_time + datetime.datetime.timedelta(seconds= (end_time - start_time).seconds / 2 )
- new_count = count(start_time, new_end_time)
- count_map.insert(0, (new_end_time, end_time, count - new_count))
- count_map.insert(0, (start_time, new_end_time, new_count))
- count = new_count
-
- cur_order_count += count
- if cur_order_count > REQ_MIN or len(count_map) = 0:
- cur_order_count = 0
- #get the orders
- process(start_time, end_time)
复制代码 这个问题确实很像v8fans描述的。但是他给的算法貌似在我的这个场合有点问题。因为count(a, b)虽然不是很消耗资源,但是每次也需要几秒钟。process(a, b)最长可以到100秒,所以我希望用尽可能少的count()次数达到有效处理的目的。
我的算法用的是二分法,因为我觉得在完全随机的情况下这个应该是最优了。没有用递归,而是用了一个堆栈来保存(a, b, count),确实类似于一个线段的集合。每次开始处理前不断的出栈直到当前count大于处理的最低门槛或者空栈。如果高于处理最大值,二分时间,把前后两段压栈,然后接着看二分后的第一段是否符合要求。 |
评分
-
查看全部评分
|