मेरे पास यह वर्ग है:

case class websiteVisitsWindow(start: Int, end: Int, visitors: Int) {
 def contains(other: websiteVisitsWindow): Boolean = other.start >= this.start && other.end <= this.end
}

उदाहरण के लिए websiteVisitsWindow के विस्तृत अनुक्रम को देखते हुए

Seq(websiteVisitsWindow(start = 1, end = 3, visitors = 5)

मैं इस Seq को निम्नलिखित समान क्रमों में विभाजित करना चाहता हूं:

Seq(
websiteVisitsWindow(start = 1, end = 1, visitors = 5), 
websiteVisitsWindow(start = 2, end = 2, visitors = 5), 
websiteVisitsWindow(start = 3, end = 3, visitors = 5)
)

इस स्तर पर visitors मान का कोई महत्व नहीं है। मेरे पास एक बुनियादी समाधान है जो गैर-विस्तृत वेबसाइट विज़िटविंडो के लिए मेरी समस्या का समाधान करता है (दिए गए ए और बी अनुक्रम 3 सेट उत्पन्न करते हैं, सेट 1: ए और बी का चौराहे, सेट 2: ए और बी का बाएं शामिल होना, सेट 3: बी और ए का दायां शामिल होना)

def splitIntoSets(as: Seq[websiteVisitsWindow], bs: 
Seq[websiteVisitsWindow]): (Seq[websiteVisitsWindow], 
Seq[websiteVisitsWindow], Seq[websiteVisitsWindow]) = {
(as, bs) match {
  case (Nil, Nil) => (Nil, Nil, Nil)
  case (_, Nil) => (Nil, as, Nil)
  case (Nil, _) => (Nil, bs, Nil)

  case _ =>
    if (bs.forall(currentItem => currentItem.start == currentItem.end)
      (
        as.filter(a => bs.exists(b => b.contains(a))),
        as.filter(a => !(bs.exists(b => b.contains(a)))),
        bs.filter(b => !(as.exists(a => a.contains(b))))
      )
    else
    {
      //for each Bs that is a wide websiteVisitsWindow break it down to a sub-sequence of smaller websiteVisitsWindow
      // i,e, websiteVisitsWindow(start = 1, end = 2, visitors = 10) => Seq(websiteVisitsWindow(start = 1, end = 1, visitors = 10), websiteVisitsWindow(start = 2, end = 2, visitors = 10))

      splitIntoSets(as, b +: bs)
    }

}
}

मुझे यकीन नहीं है कि यह एक सही दृष्टिकोण है, लेकिन मैं वर्तमान में कुछ इस तरह (स्यूडोकोड) के बारे में सोच रहा हूं:

- Find the number of sequences to generate (essentially grabbing start and end values)
- Generate an websiteVisitWindow for each item in range from start value to end value as above such that the start and end values are set as the current value in the range
- Append this websiteVisitWindow to the list of bs
- Iterate over the wide interval, breaking it down until the end condition is met
0
user3674993 24 जिंदा 2019, 07:01

1 उत्तर

सबसे बढ़िया उत्तर

मुझे एक पुनरावर्ती कार्य के साथ एक समाधान मिला, मुझे कुछ समय लगा लेकिन मुझे यह अंत में काम करने के लिए मिला।

def splitIntoSets(visitors: Seq[websiteVisitsWindow], schedule: Seq[websiteVisitsWindow]): (Seq[websiteVisitsWindow], Seq[websiteVisitsWindow], Seq[websiteVisitsWindow]) = {
(visitors, schedule) match {
  case (Nil, Nil) => (Nil, Nil, Nil)
  case (_, Nil) => (Nil, visitors, Nil)
  case (Nil, _) => (Nil, schedule, Nil)

  case _ =>
    if (schedule.forall(currentItem => currentItem.start == currentItem.end)) {

      (
        visitors.filter(visitor => schedule.exists(scheduleWebsiteVisitsWindow => scheduleWebsiteVisitsWindow.contains(visitor))),
        visitors.filter(visitor => !(schedule.exists(scheduleWebsiteVisitsWindow => scheduleWebsiteVisitsWindow.contains(visitor)))),
        schedule.filter(scheduleWebsiteVisitsWindow => !(visitors.exists(visitor => visitor.contains(scheduleWebsiteVisitsWindow))))
      )
    }
    else {

      val (sameStartEndTimes, wideStartEndTimes) = schedule.partition(websiteVisitsWindow => websiteVisitsWindow.start == websiteVisitsWindow.end)

      val startTime = wideStartEndTimes.map(firstValue => firstValue.start).toSeq(0).toInt
      val endTime = wideStartEndTimes.map(firstValue => firstValue.end).toSeq(0).toInt

      val startEndTimeList = (startTime to endTime).toList

      val expandedWideWebsiteVisitsWindow = startEndTimeList.map(
        currentItem => websiteVisitsWindow(start = currentItem, end = currentItem, visitors = 0)
      )

      val remainingWideWebsiteVisitsWindows = wideStartEndTimes.tail

      splitIntoSets(visitors, (sameStartEndTimes ++ expandedWebsiteVisitsWindow ++ remainingWideWebsiteVisitsWindows))
    }

}
}
0
user3674993 8 फरवरी 2019, 00:58