LINUX.ORG.RU

История изменений

Исправление dimgel, (текущая версия) :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом, чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих; в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла (UPD TODO противоречит последнему пункту?).

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак; к слову – в наносекундах от моего epoch2 = 2025-01-01);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым дальним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с бОльшим launch time.

Как-то так. Пока что вроде всё выглядит красиво.

Исправление dimgel, :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих; в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла (UPD TODO противоречит последнему пункту?).

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак; к слову – в наносекундах от моего epoch2 = 2025-01-01);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым дальним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с бОльшим launch time.

Как-то так. Пока что вроде всё выглядит красиво.

Исправление dimgel, :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих; в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла (UPD TODO противоречит последнему пункту?).

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак; к слову – в наносекундах от моего epoch2 = 2025-01-01);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым последним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с бОльшим launch time.

Как-то так. Пока что вроде всё выглядит красиво.

Исправление dimgel, :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих; в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла (UPD TODO противоречит последнему пункту?).

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым последним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с бОльшим launch time.

Как-то так. Пока что вроде всё выглядит красиво.

Исправление dimgel, :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих – но тут и чистый binary heap сработает не лучше; а в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла (UPD TODO противоречит последнему пункту?).

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым последним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с бОльшим launch time.

Как-то так. Пока что вроде всё выглядит красиво.

Исправление dimgel, :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих – но тут и чистый binary heap сработает не лучше; а в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла (UPD TODO противоречит последнему пункту?).

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым последним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с БОЛЬШИМ launch time.

Как-то так. Пока что вроде всё выглядит красиво.

Исходная версия dimgel, :

На текущий момент план такой: рисую вариацию binary heap (tnx @annulen), который суть дерево (tnx @timdorohin), но в корневом узле минимальный (ближайший) launch time, т.е. время извлечения O(0). При этом чтобы при добавлении узлов (которое будет весьма частым: периодические запуски нужно заново добавлять сразу после исполнения) не копировать куски дерева туда-сюда:

  • организую не в массиве а в {Node* parent; Node* children[2]} (плюс кастомный memory manager);
  • разрешаю узлы с 1 потомком.

В худшем случае, если у ВСЕХ узлов будет по 1 потомку, это будет double-linked list, который по слухам (tnx @firkax) мой объём вытянет. Но такое случится только если каждый добавляемый узел будет иметь launch time больше всех предыдущих – но тут и чистый binary heap сработает не лучше; а в противном случае добавление заполнит пустого второго ребёнка какого-то промежуточного узла.

Ну и чтобы какая-нить заклинившая задача, долго выполняющаяся и постоянно повторно добавляющая себя с delay=0, не заблокировала все остальные задачи в очереди, буду делать так:

  • храню в узлах не delay, а launch time (по-другому собственно и никак);
  • если при добавлении узла, идя по дереву от корня, я напарываюсь на узел с таким же launch time, то пропускаю его и его потомков с совпадающими launch time и добавляю новую задачу в конец (самым последним потомком).
  • соответственно, у одного узла запрещаю детей с одинаковыми launch time, а для добавления ноды, чей launch time больше чем у обоих детей, выбираю поддерево с БОЛЬШИМ launch time.

Как-то так. Пока что вроде всё выглядит красиво.