2017-05-30 8 views
0

私はアパートを借りる会社のシステムを作成しています。すべての価格設定は、いくつかの期間に基づいています。たとえば、カテゴリ「ジュニア・メーカー」のアパートは、価格帯があります。期間に基づく価格計算アルゴリズム

30.05.2016 - 31.01.2017: 3000 EUR 
01.02.2017 - Infinity: 4000 EUR 

追加などの期間もあります。他の期間に基づいて税、季節の価格(プラス/マイナスいくつかのパーセント値)、およびサービス料。だから、価格は、たとえば、頻繁に変えることができ:

誰かが例えば15日未満のためにアパートを借りたい場合は
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%は言うことができます - このすべては、動的に設定されています。

ここでは問題は私たちのページにあるので、ユーザーは価格に基づいてアパートを見つけることができます。例えば、いくつかのユーザーは3000から4000ユーロの間で価格が変化し、マンションを6ヶ月間賃貸するアパートのみを探したいと思っています。私が言ったように、価格はその期間に例えば5回変わることができるので、私は平均価格を計算しようとしています。指定された期間をすべて組み込むためにこのアルゴリズムをどのように実装すればよいか考えてください。たとえば、可能なレコードが500個あると仮定し、これを動的に計算するとパフォーマンスの問題が発生する可能性があります。 、 dateFrom:

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); 
    } 

私はユニークな価格帯のリストを作成し、すべてのそれらの期間に基づいて:ここで

UPDATE

は一つの建物のための1つのアパートのカテゴリに関連する期間を取るためにいくつかのコードですdateTo、通貨、値 これらの手順の後、私は1つのカテゴリの一意の価格のリストを持っています。それから私は、それらのユニークな価格帯のそれぞれに何日の予約があるかを計算し、それを乗算し、ラウンド+税金を掛けて、それを合計して予約の最終価格を得る必要があります。これらのステップをもう一度実行すると、500回(複数のビルディングで複数のカテゴリ)と言うことができます。

+1

明示的には述べられていませんが、アパートメントあたりの期間は重複せず、その組合は負の無限大から正の無限大までの期間をカバーすると仮定できますか? – Codor

+0

@Codorはいアパートあたりの各価格期間はユニークです。毎日有効な価格は1つだけですが、顧客の予約全体には複数の可能な価格があります。 – jgr

答えて

1

コメントに記載されているように、オンザフライで500回6つの数値を平均してもパフォーマンスの問題は発生しません。

でも、O(1)の価格計算でのパフォーマンス(つまり、計算された期間内の価格スイッチの数に依存しない)を使用する場合は、日付を0日として定義して前処理することができますそれ以上の日数に必要な総賃貸料の額。ユーザーが期間の平均賃貸料を要求した場合は、2日間から0日までの総賃料を減算し、その間の賃料をあなたに与えます。これを日数で割ると、平均賃料が得られます。滞在期間に応じて適切な乗数を追加することもできます(15%の料金を追加するなど)。これは、配列内の2つのインデックス間の値の合計をO(1)に見つけることと似ています。これはメモリに優しい提案ではありませんが、メモリを少なくするように修正できます。

利点は、結果をもたらす計算が価格スイッチの数に依存しないことです。しかし、アパートの家賃の追加変更があると、いくらかの量の前処理が行われます。

1

実際には2つのアルゴリズムが必要だと思います。与えられた時間にオブジェクト価格を表現し、照会するためのもの。また、一定期間オブジェクトをレンタルするための価格を計算するもう1つの方法もあります。

オブジェクト価格の表記については、サポートする時間単位(例:日または月)について決定する必要があります。次に、ルックアップテーブルまたは意思決定ツリー、ニューラルネットワーク、または与えられたオブジェクトまたはオブジェクトクラスの曜日または月の価格を検索するためのものを作成します。そこに入れたいすべての変数を考慮に入れることができます。暦月全体を借りるための特別価格をサポートしたい場合は、この異なる単位の別のデータ構造を用意してください。

次に、期間を指定すると、対応する一連の日付または月を生成し、日別または月別の個別価格を照会し、総額を計算するために合計を計算する必要があります。必要に応じて、毎日の平均月額料金を計算することができます。

ここでパフォーマンスが問題になるとは思わない。あなたが実際の解決策を考え出す前に対処する必要がある問題は、少なくとも早すぎるものではありません。その場合は、データベースの規模を拡大することを検討してください。

関連する問題