Очереди и двойные очереди в луа

Страницы: Пред. 1 ... 22 23 24 25 26
RSS
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
VPM, С ног на голову, говорите? Ну, давайте поставим на ноги: мой скрипт давно написан, отлажен, работает в боевом режиме прямо сейчас, тикеров у него на два порядка больше, чем у вас, никаких проблем ни с памятью, ни с быстродействием нет от слова "совсем", все глюки системного софта (по крайней мере, все известные мне) купированы, моё "частное решение" реализовано! Ваше же "общедоступное решение" НЕ реализовано и не будет реализовано НИКОГДА.
 
Владимир,  Я Вас поздравляю с отличным решением! Я ушел заниматься своим, а то действительно не соберу. НО ХОЧЕТСЯ ПОДНЯТЬ  новую тему?
 
----- lifo из двусвязной очереди и пример позволят вести себя как стек - обеспечивая LIFO-порядок.
Скрытый текст

Еще одна реализация стека, по сути это тоже самое что и в букваре только реализация в виде класса, просто удобней пользоваться., наследуется без проблем, легко дописать фифо. У себя делаю лифо  для контроля памяти, создавая динамические окна. Выкладываю может кому еще сгодится.
 
Цитата
Nikolay написал:
Открываете пример MA.lua, например расчет SMA, и видите использование массива sum равного длине периода.

Да нет, вроде, в sum хранятся значения по всем свечам:

Код
function F_SMA()
   local sum = {}
   local it = {p=0, l=0}
return function (I, P, VT, ds)
   if I == 1 then
      sum = {}
      it = {p=0, l=0}
   end
   if CandleExist(I,ds) then
      if I~=it.p then it={p=I, l=it.l+1} end
      local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
      sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
      if it.l >= P then
         return (sum[Ip] - (sum[Ippp] or 0)) / P
      end
   end
return nil
end
end
 
А, разобрался: функция Squeeze возвращает индекс в массиве "по кольцу" в пределах заданного периода.
 
Цитата
VPM написал:
-- Создание LIFO из двусвязанной очереди
table.insert / table.remove делают то же самое, только быстрее.
 
Цитата
VPM написал:
---- lifo из двусвязной очереди и пример позволят вести себя как стек - обеспечивая LIFO-порядок
Можно гораздо проще:
Код
local LIFO = {}
LIFO.__index = LIFO
function LIFO.new()
  return setmetatable({}, LIFO)
end
function LIFO:push(v)
  self[#self+1] = v
end
function LIFO:pop()
  local idx = #self
  if idx == 0 then return nil end
  local v = self[idx]
  self[idx] = nil
  return v
end
 
Если Вы про оптимизацию, то  согласен без спорно быстрее. Но иногда  просто нужен тупой код прямолинейный как стрела, для пользователей типа меня, просто что его можно было прочесть, и успокоится что все выполняется как надо. Здесь ключевое выполняется как надо? А разве нет?
 
Цитата
VPM написал:
Но иногда  просто нужен тупой код прямолинейный как стрела
Прямолинейный для LIFO - это работа с таблицей стандартными методами.
Поскольку у вас добавление и извлечение всегда с конца таблицы, то как функции table.insert / table.remove, так и обычное присваивание последнему элементу в таблице будет работать вполне себе быстро и понятно.
Зачем городить очередь с двумя индексами для LIFO - большая загадка  :shock:
 
Йцукен, Речь шла прежде всего про универсальность, какой еще подход дает возможность, из одного подхода создавать разные очереди? Тут удивляться не чему, одна базовая и делай из нее  под свою задачу что нужно. А если это модуль то и сколько нужно. Возможно инженерия кода и заслуживает замечаний, но речь идет о самом подходе. В Вашем примере меня сильно смущает вот этот момент self[idx] = nil дыр не будет? А если все в порядке, то почему бы нет, все на первый взгляд элегантно?
 
Цитата
VPM написал:
подход дает возможность, из одного подхода создавать разные очереди?
Не, ну если вам нужно одновременно для одной очереди и FIFO и LIFO, тогда да, очередь с двумя индексами более подходящая под эту задачу. Но нужно понимать, что нельзя в таком случае в разных потоках работать с одной стороны очереди. В разных потоках можно только FIFO: в одном потоке положил, в другом вытащил.
Но если используется для конкретной задачи LIFO, то не стоит усложнять. Достаточно классических методов работы с таблицами.

Цитата
VPM написал:
В Вашем примере меня сильно смущает вот этот момент self[idx] = nil дыр не будет?
Каких дыр? Мы вынули последний элемент таблицы, и присвоили ему значение nil. В таком случае оператор # работает корректно.
Но я просто привёл пример, как можно упростить ваш код, если вам "кровь из носу" нужно ООП.
А вообще для LIFO достаточно:
Код
tbl = {}         -- создать таблицу
tbl[#tbl+1] = v     -- добавить в конец таблицы
v = tbl[#tbl]       -- получить последний элемент таблицы
tbl[#tbl]           -- удалить последний элемент таблицы
Но вы это и без меня знаете  :wink:
Страницы: Пред. 1 ... 22 23 24 25 26
Читают тему
Наверх