2017-05-30 72 views
0

我正在爲租賃公寓的公司創建系統。所有定價設置都基於某些時段。例如,在分類「少年工作室」公寓有價格時期:基於期間的價格計算算法

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個可能的記錄,所以動態計算這可能會導致性能問題。

UPDATE

下面是一些代碼,以與一個公寓類爲一個建設週期:

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,貨幣,價值 經過這些步驟後,我有一個類別的獨特價格列表。然後,我需要計算在這些獨特價格週期中每個預訂有多少天,然後乘以它,也許是整數+乘以稅,然後求和以得到預訂的最終價格。現在重新運行這些步驟可以說500次(多個建築物中的多個類別)。

+1

雖然沒有明確說明,我們可以假設每個公寓的週期不重疊,它們的聯合覆蓋了從負無窮到正無窮的時間跨度? – Codor

+0

@Codor是每個公寓的每個價格期間都是獨一無二的。所以對於每一天只有一個有效的價格,但對於整個客戶預訂有多個可能的價格。 – jgr

回答

1

正如評論中提到的那樣,動態平均6次數字500次不會導致任何性能問題。即使如此,如果您希望O(1)表示計算價格(即計算不應取決於所述期間內的價格轉換數量),您可以通過將日期定義爲第0天並計算除此之外的所有日子所需的總租金數額。當用戶在一段時間內請求平均租金時,從兩天中減去到第零日的總租金,爲您提供中間期間的租金。除以這個天數將給你平均的租金。您還可以根據停留時間(添加15%電荷)添加合適的乘數等。這類似於在O(1)中查找數組中兩個索引之間的值的總和。這不是一個內存友好的建議,但可以修改它以使用較少的內存。

優點是計算結果不會取決於價格開關的數量。然而,公寓租金的每一次額外變化都會導致一定數量的預處理。

1

我想你實際上需要兩種算法。一個用於在任何給定時間表示和查詢目標價格。另一個用於計算給定時間段租用物品的價格。

至於對象價格的表示形式,您應該決定您想要支持的時間粒度,例如幾天或幾個月。然後創建一個查找表或決策樹,神經網絡或任何東西來查找給定對象或對象類的給定日期或月份的價格。你可以考慮你想要的所有變量。如果您希望支持租用完整日曆月份的特殊價格,請爲這個不同的粒度設置另一個數據結構,您可以使用月份而不是日期查詢。

然後,給定一段時間後,您需要生成相應的一系列日期或月份,查詢單個每日或每月價格,然後計算總和以獲得總價格。如果你願意,你可以計算平均每日/每月價格。

我不認爲性能會成爲問題。在提出實際解決方案之前,至少不應該解決問題(因爲過早優化)。如果是這樣,考慮擴大您的數據庫。