2015-03-11 3 views
-2

Я застреваю, пытаясь разработать алгоритм для решения периодов времени с различным приоритетом в классическом ASP.Сроки слияния по приоритетному алгоритму

Есть ли способ разрешить период времени, перекрываемый более высоким периодом приоритета (без разрешения приоритета в каждый день)?

-

Пример ввода:

periodId(0) = 0: startDate(0) = dateValue("15-01-01"): endDate(0) = dateValue("15-03-31")  
periodId(1) = 1: startDate(1) = dateValue("15-01-18"): endDate(1) = dateValue("15-02-08")  
periodId(2) = 2: startDate(2) = dateValue("15-02-02"): endDate(2) = dateValue("15-02-16")  
periodId(3) = 3: startDate(3) = dateValue("15-01-29"): endDate(3) = dateValue("15-02-05")  
periodId(4) = 4: startDate(4) = dateValue("15-03-01"): endDate(4) = dateValue("15-03-08") 

-

пример вывода:

resolvedId(0) = 0: resolvedStart(0) = "15-01-01": resolvedEnd(0) = "15-01-17"  
resolvedId(1) = 1: resolvedStart(1) = "15-01-18": resolvedEnd(1) = "15-01-28"  
resolvedId(2) = 3: resolvedStart(2) = "15-01-29": resolvedEnd(2) = "15-02-05"  
resolvedId(3) = 2: resolvedStart(3) = "15-02-06": resolvedEnd(3) = "15-02-16"  
resolvedId(4) = 0: resolvedStart(4) = "15-02-17": resolvedEnd(4) = "15-02-28"  
resolvedId(5) = 4: resolvedStart(5) = "15-03-01": resolvedEnd(5) = "15-03-08"  
resolvedId(6) = 0: resolvedStart(6) = "15-03-09": resolvedEnd(6) = "15-03-31" 

Пример в графике:

Example Output

... любые идеи?

Спасибо заранее!

----- EDIT 15-03-13 -----

мне нужен массив в качестве вывода - изображение только для лучшего понимания. Мне нужны массивы с датами как выход ...

Я разработал алгоритм:

<%' .... 
i = 0 
while not objRS.Eof 
    redim preserve periodId(i) 'integer 
    redim preserve startDate(i) 'date 
    redim preserve endDate(i) 'date 

    'DB parse 
    periodId(i) = objRS("idc") 
    periodStartDateIn(i) = DateValue(objRS("tempDatumStart")) 
    periodEndDateIn(i) = DateValue(objRS("tempDatumKonec")) 

    'date limit detection 
    if periodStartDateIn(i) < resolvedMinDate then resolvedMinDate = periodStartDateIn(i) 
    if periodEndDateIn(i) > resolvedMaxDate then resolvedMaxDate = periodEndDateIn(i) 

    i = i + 1 
    objRs.moveNext 
wend 

lastIndex = -1 
redim preserve resolvedIndex(0) 
redim preserve resolvedStartDate(0) 
redim preserve resolvedEndDate(0) 
for dateActual = resolvedMinDate to resolvedMaxDate 
    for index = lbound(periodId) to ubound(periodId) 
     if periodStartDateIn(index) <= dateActual and dateActual <= periodEndDateIn(index) then 
      IndexActual = index 
      exit for 
     end if 
    next 

    if IndexActual <> lastIndex then 
     if lastIndex <> -1 then 'not first pass 
      redim preserve resolvedIndex(ubound(resolvedIndex) + 1) 
      redim preserve resolvedStartDate(ubound(resolvedStartDate) + 1) 
      redim preserve resolvedEndDate(ubound(resolvedEndDate) + 1) 
      resolvedEndDate(ubound(resolvedEndDate)-1) = dateActual - 1 'close prev period 
     end if 
     resolvedIndex(ubound(resolvedIndex)) = IndexActual 
     resolvedStartDate(ubound(resolvedStartDate)) = dateActual 
    end if 
    lastIndex = IndexActual 
next 
resolvedEndDate(ubound(resolvedEndDate)) = dateActual - 1 

'... 
%> 

... но он проверяет каждую дату в интервале. Это займет довольно много времени, чтобы решить в течение многих периодов и нескольких десятилетий между startDate и endDate ...

... есть ли какой-либо алгоритм для его решения аналитическим способом?

ответ

2

Это больше проблема дизайна. Вам нужно сесть с карандашом и бумагой и выработать возможные ситуации, которые могут возникнуть. Ключевые вещи здесь, где ваши могут накладываться:

  _______________________________ 
    |<Start Time   End Time>| <-- Comparable time range 

|<Start Time   End Time>| 

     |<Start Time   End Time>| 

     |<Start Time End Time>| 

|<Start Time     End Time>| 

Есть и другие вещи, чтобы рассмотреть здесь, а также, например, без пуска (х) или конечное время.

Что касается вывода, я бы рассмотрел запись вывода на div s, которые имеют относительное позиционирование, и просто устанавливают атрибуты CSSи width.

Смежные вопросы