Информация об изменениях

Сообщение Re[85]: The door от 27.07.2018 7:29

Изменено 27.07.2018 7:41 Serginio1

Re[85]: The door
Здравствуйте, vdimas, Вы писали:



V>Это если бы курсы были на каждый день, но курс на данную дату нужно вычислять по max(change_date) where change_date<=doc_date.

V>В этом месте начинаются тормоза.

Поиск на == и <= используют один и тот же алгоритм половинного деления по индексу.
Сложность одинакова. Только при курсе на каждый день нужно заполнять все дни (выходные, праздники когда торги не проходят), что увеличивает размер таблицы и индекса


Посмотри метод Navigate http://rsdn.org/article/alg/tlsd.xml
Автор(ы): Сергей Смирнов (Serginio1)
Дата: 14.08.2004
Пример реализации двухуровневого массива с помощью нового средства С# — generics. Сравнение производительности различных реализаций сортированных списков.

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

      public
      enum NavigateFlag : byte
{ 
  Eqality,           // ==
  LessThan,          // <
  GreaterThan,       // >
  LessThanOrEqval,   // <=
  GreaterThanOrEqval // >=
}

А вот реализация этой функции:

      public
      bool Navigate(K Key, NavigateFlag flag)
{ 
  bool result = this.NavigateKey(Key);
// Запоминается последняя позиция поиска
 // _currentElementIndex = lo;

  switch(flag)
  {
    case NavigateFlag.Eqality :
      return result;
    case  NavigateFlag.GreaterThanOrEqval:
      if (result)
        return true;
    goto case NavigateFlag.GreaterThan;
    case  NavigateFlag.GreaterThan:
      if (result)
        _currentElementIndex++;

      if (CurrentLeafPage.Count == _currentElementIndex)
      {
        if (CurrentLeafPage.NextPage == null)
        {
          _selected = false;
          return false;
        }
        else
        {
          CurrentLeafPage = CurrentLeafPage.NextPage;
          _currentElementIndex = 0;
        }
      }
      
      _selected = true;
      return true;
    case NavigateFlag.LessThanOrEqval :
      if (result)
        returntrue;
    goto case NavigateFlag.LessThan;
    case NavigateFlag.LessThan:
      return this.GetPriorRecord();
  }

  return result;
}
Re[85]: The door
Здравствуйте, vdimas, Вы писали:



V>Это если бы курсы были на каждый день, но курс на данную дату нужно вычислять по max(change_date) where change_date<=doc_date.

V>В этом месте начинаются тормоза.

Поиск на == и <= используют один и тот же алгоритм половинного деления по индексу.
Сложность одинакова. Только при курсе на каждый день нужно заполнять все дни (выходные, праздники когда торги не проходят), что увеличивает размер таблицы и индекса


Посмотри метод Navigate http://rsdn.org/article/alg/tlsd.xml
Автор(ы): Сергей Смирнов (Serginio1)
Дата: 14.08.2004
Пример реализации двухуровневого массива с помощью нового средства С# — generics. Сравнение производительности различных реализаций сортированных списков.

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

      public
      enum NavigateFlag : byte
{ 
  Eqality,           // ==
  LessThan,          // <
  GreaterThan,       // >
  LessThanOrEqval,   // <=
  GreaterThanOrEqval // >=
}

А вот реализация этой функции:

      public
      bool Navigate(K Key, NavigateFlag flag)
{ 
  bool result = this.NavigateKey(Key);
// Внутри NavigateKey(Key)
//если не нашли по ключу  
//  _selected = false;
// Помещаем в _currentElementIndex позицию в которую  можно добавить элемент с искомым ключом.
//  _currentElementIndex = lo;

  switch(flag)
  {
    case NavigateFlag.Eqality :
      return result;
    case  NavigateFlag.GreaterThanOrEqval:
      if (result)
        return true;
    goto case NavigateFlag.GreaterThan;
    case  NavigateFlag.GreaterThan:
      if (result)
        _currentElementIndex++;

      if (CurrentLeafPage.Count == _currentElementIndex)
      {
        if (CurrentLeafPage.NextPage == null)
        {
          _selected = false;
          return false;
        }
        else
        {
          CurrentLeafPage = CurrentLeafPage.NextPage;
          _currentElementIndex = 0;
        }
      }
      
      _selected = true;
      return true;
    case NavigateFlag.LessThanOrEqval :
      if (result)
        returntrue;
    goto case NavigateFlag.LessThan;
    case NavigateFlag.LessThan:
      return this.GetPriorRecord();
  }

  return result;
}