2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Частое обновление массива.
Сообщение18.03.2013, 20:46 
Заслуженный участник
Аватара пользователя


23/08/07
5500
Нов-ск
arseniiv в сообщении #697818 писал(а):
То русское, что было в начале, из-за понятности мне я не могу перевести ещё раз. :?

Будем считать, что не было никакой проблемы.

 Профиль  
                  
 
 Re: Частое обновление массива.
Сообщение18.03.2013, 21:06 
Заслуженный участник
Аватара пользователя


06/04/10
3152
arseniiv в сообщении #697801 писал(а):
Сразу видно, что способом venco ...— можно превратить в искомую.

У него не было отдельной записи для сохранения последней инициализации и не хватает детализации.

 Профиль  
                  
 
 Re: Частое обновление массива.
Сообщение18.03.2013, 21:11 


05/09/12
2587
У него все было и всего хватает. И идея высказана в одной фразе - и всего достаточно, и все все понятно (и было понятно сразу без дополнительных пояснений). Единственные претензии к его предложению могут быть только насчет ограничения максимальной версии, и то можно себе позволить в такой модели один раз за $2^{32}$ версий и пробежаться по всему массиву - обнулить версии.

 Профиль  
                  
 
 Re: Частое обновление массива.
Сообщение18.03.2013, 21:12 
Заслуженный участник
Аватара пользователя


03/12/11
640
Україна
Вот реализация идеи venco в виде модуля Delphi:

код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
unit OftenInitArray;

interface

type
  TOftenInitArray<TElement> = class
  type
    TVersionedValue = record
      Value: TElement;
      Version: Cardinal;
    end;
  private
    FSize: Integer;
    FGlobalState: TVersionedValue;
    FArray: array of TVersionedValue;
    procedure ZeroVersions;
    procedure CheckIndex(Index: Integer);
    function GetElement(Index: Integer): TElement;
    procedure SetElement(Index: Integer; const NewValue: TElement);
  public
    constructor Create(Size: Integer; const InitialValue: TElement);
    property Element[Index: Integer]: TElement read GetElement write SetElement; default;
    procedure Initialize(const Value: TElement);
  end;

implementation

uses SysUtils;

procedure TOftenInitArray<TElement>.ZeroVersions;
var i:Integer;
begin
  for i:=0 to FSize-1 do
    FArray[i].Version:=0;
  FGlobalState.Version:=0;
end;

procedure TOftenInitArray<TElement>.CheckIndex(Index: Integer);
begin
  if (Index<0) or (Index>=FSize) then
    raise Exception.CreateFmt('Неправильный индекс массива: %d',[Index]);
end;

procedure TOftenInitArray<TElement>.Initialize(const Value: TElement);
begin
  FGlobalState.Value:=Value;
  try
    Inc(FGlobalState.Version);
  except
    on EIntOverflow do
    begin
      ZeroVersions;
      Inc(FGlobalState.Version);
    end;
  end;
end;

constructor TOftenInitArray<TElement>.Create(Size: Integer; const InitialValue: TElement);
begin
  FSize:=Size;
  SetLength(FArray, Size);
  ZeroVersions; // Можно удалить этот вызов отсюда в целях ускорения
  Initialize(InitialValue);
end;

function TOftenInitArray<TElement>.GetElement(Index: Integer): TElement;
begin
  CheckIndex(Index);
  with FArray[Index] do
    if Version=FGlobalState.Version then Result:=Value
                                    else Result:=FGlobalState.Value;
end;

procedure TOftenInitArray<TElement>.SetElement(Index: Integer;
  const NewValue: TElement);
begin
  CheckIndex(Index);
  with FArray[Index] do
  begin
    Value:=NewValue;
    Version:=FGlobalState.Version;
  end;
end;

end.

 Профиль  
                  
 
 Re: Частое обновление массива.
Сообщение18.03.2013, 21:16 
Заслуженный участник


27/04/09
28128
nikvic в сообщении #697837 писал(а):
У него не было отдельной записи для сохранения последней инициализации
Как не было? Он сказал:
venco в сообщении #697568 писал(а):
Надо увеличить версию массива на 1 и сохранить новое значение по умолчанию. При записи элемента ему присваивается версия массива и новое значение. При чтении если версия элемента меньше версии массива, значит берём дефолтное значение массива, иначе значение из самого элемента.

Т. е. хранятся массив пар (элемент, версия), значение по умолчанию, версия. Всё упомянуто. Я неправильно прочитал?

nikvic в сообщении #697837 писал(а):
и не хватает детализации.
Какой ещё? Разве что при создании массива надо спрашивать и значение по умолчанию, и провести им инициализацию как описано. Это добавление должно бы закрыть все возможности неопределённого поведения; если вы не согласны, пожалуйста, скажите, почему.

 Профиль  
                  
 
 Re: Частое обновление массива.
Сообщение18.03.2013, 21:17 
Заслуженный участник
Аватара пользователя


06/04/10
3152
_Ivana в сообщении #697845 писал(а):
У него все было и всего хватает.

Перечитал и согласился :wink:

 Профиль  
                  
 
 Posted automatically
Сообщение04.11.2013, 01:50 
Основатель
Аватара пользователя


11/05/05
4313
 i  Тема перемещена из форума «Олимпиадные задачи (М)» в форум «Олимпиадные задачи (CS)»
Причина переноса: не указана.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group