我正在为租赁公寓的公司创建系统。所有定价设置均基于某些时段。例如,“Junior Studio”类别中的公寓有价格期间:
30.05.2016 - 31.01.2017: 3000 EUR
01.02.2017 - Infinity: 4000 EUR
还有其他期间,如:税收,季节性价格(加/减一些百分比值),以及基于其他期间的费用。因此价格可能经常变化,例如:
31.05.2016 - 30.06.2016 (3500EUR because of some seasonal price period)
01.07-31.08.2016 (5000EUR other seasonal price period)
01.09.2016 - 31.01.2017 (3000 EUR)
01.02.2017 - 4000 EUR.
此外,如果有人想租房子,例如少于15天,则需要支付额外费用,比如15% - 这一切都是动态设置的。
现在问题出现在我们的页面上,我们应该让用户根据价格找到公寓。例如,一些用户想要找到价格在3000到4000欧元之间的公寓,并且租用公寓6个月。正如我所说,价格在这些时期可以改变5次,所以我想计算一个平均价格。
您是否知道如何实施此算法以合并所有指定的时间段?我们假设可能有500个可能的记录,因此动态计算这可能会导致性能问题。
更新
以下是一些代码,用于处理与一个建筑物的一个公寓类别相关的期间:
private RentPriceAggregatedPeriodsDto prepareRentPriceAggregator(Long buildingId, Long categoryId, LocalDate dateFrom, LocalDate dateTo, Integer duration) {
List<CategoryPricePeriod> pricePeriods = categoryPricePeriodRepository.findCategoryPricePeriods(buildingId, categoryId, dateFrom, dateTo);
List<SeasonalPricePeriod> seasonalPricePeriods = seasonalPricePeriodRepository.findSeasonalPricePeriods(buildingId, categoryId, dateFrom, dateTo);
List<LastMinuteRatePeriod> lastMinuteRatePeriods = lastMinuteRatePeriodRepository.findLastMinuteRatePeriods(buildingId, categoryId, dateFrom, dateTo);
List<TaxesDefinitionPeriodDto> taxesDefinition = taxesDefinitionService.findTaxPeriodsForBuildingAndCategory(buildingId, categoryId, TaxTypeCode.VAT,
dateFrom, dateTo);
Optional<SurchargePolicy> surcharge = surchargePolicyRepository.findForDurationAndRentalObjectCategoryIds(categoryId, buildingId, duration);
return new RentPriceAggregatedPeriodsDto(pricePeriods, seasonalPricePeriods, lastMinuteRatePeriods, taxesDefinition, surcharge);
}
根据所有这些期间,我准备了唯一价格周期列表:dateFrom, dateTo, currency, value
。在这些步骤之后,我列出了一个类别的独特价格。然后,我需要计算每个独特价格周期中的预订天数并将其乘以,可能是圆形+乘以税,并将其相加以得到预订的最终价格。现在重新运行这些步骤,比如500次(多个建筑物中的多个类别)。
答案 0 :(得分:1)
如评论中所述,动态平均6次数量500次不应导致任何性能问题。
即便如此,如果您想要O(1)
性价比计算(即计算不应取决于上述期间的价格转换次数),您可以通过将日期定义为第0天,并计算除此之外的所有日子所需的总租金金额。当用户请求一段时间之间的平均租金时,从两天中减去总租金直到第0天,给出两者之间的租金。将此除以天数将给出平均租金。您还可以根据停留时间(添加15%的费用)等添加合适的乘数。这类似于在O(1)
中查找数组中两个索引之间的值之和。这不是一个内存友好的建议,虽然可以修改它以减少内存使用。
优点是给出结果的计算不依赖于价格转换的数量。但是,公寓租金的每次额外变化都会导致一些预处理。
答案 1 :(得分:1)
我认为你实际上需要两种算法。一个用于在任何给定时间表示和查询对象价格。另一个用于计算在给定时间段内租用物品的价格。
至于对象价格的表示,您应该决定要支持的时间粒度,例如天或月。然后创建查找表或决策树,神经网络或任何内容,以查找给定对象或对象类在给定日期或月份的价格。您可以考虑您希望拥有的所有变量。如果您想支持租用完整日历月的特殊价格,请为此不同的粒度提供另一种数据结构,您可以使用月份而非日期查询。
然后,给定一段时间,您需要生成相应的日期或月份系列,查询每日或每月的个人价格,然后计算总和以获得总价。如果您愿意,您可以计算平均每日/每月价格。
我认为表演不会成为问题。在提出实际解决方案之前,至少不应该解决任何问题(因为,过早优化)。如果是,请考虑扩展数据库。