Поиск элемента в таблице

Страницы: 1
RSS
Поиск элемента в таблице
 
Добрый день!
В скрипте используется таблица Tab, каждый элемент которой является строкой.
Есть также отдельная переменная S, значение которой также является строкой.
Существует ли в Lua простой способ проверить наличие или отсутствие в таблице Tab элемента, значение которого равно значению переменной S ?
То есть способ сделать это без использования оператора цикла с проверкой каждого отдельного элемента таблицы.
 
даже если не использовать циклы в самом скрипте - это не значит, что они (циклы) не будут использованы в движке LUA. Так что тут гадать и выдумывать не стоит. Для начала, вот ссылка на работу со строками в LUA: http://lua-users.org/wiki/StringLibraryTutorial
 
во всех алгоритмах идёт сравнение побайтно, в более современных - сравнение с хешем, есть реализации с C++ STL, правда в силу своей специфичности и того, что его "ляпают" все и везде где не попало - в большинстве своём, невсегда удачные.
 
Тут стоит вопрос не об оптимизации скорости работы скрипта, а о минимизации и упрощении его текста.
Ну и по работе со строками как таковыми мне все более-менее понятно, а вот о средствах Lua для поиска среди элементов таблицы я пока мало что знаю (кроме тупого перебора их в цикле).
 
Дмитрий,
В чистом луа таких средств нет.
Для упрощения текста оформите функции поиска элементов в таблице в виде модуля
или найдите готовый модуль.
 
Понятно. Спасибо, что избавили от необходимости тратить время на поиски в документации того, чего не существует :)
 
Цитата
Дмитрий пишет:
Тут стоит вопрос не об оптимизации скорости работы скрипта, а о минимизации и упрощении его текста.
Ну и по работе со строками как таковыми мне все более-менее понятно, а вот о средствах Lua для поиска среди элементов таблицы я пока мало что знаю (кроме тупого перебора их в цикле).
Во многом это зависит от используемых алгоритмов обработки и хранения данных. В каждом случае можно придумать вариант оптимальный по скорости работы и объему кода.

Код
test_table={"qwe", "1qweasd", "zxc"}
test_table1={["qwe"]=true, ["1qweasd"]=true, ["zxc"]=true}
str = "1qweasd"

function check1(t, str)
  return (string.find("|"..table.concat(t,"|").."|", "|"..str .. "|") ~=nil)
end

function check2(t, str)
  for k, v in pairs(t) do
    if v == str then return true end
  end
  return false
end

function check3(t, str)
  return (t[str] or false)
end
max_count=1000000
_s=os.clock()
for i=1, max_count do
  res = check1(test_table, str)
end
_e = os.clock()
print("check1 took "..tostring(_e-_s))
_s=os.clock()
for i=1, max_count do
  res = check2(test_table, str)
end
_e = os.clock()
print("check2 took "..tostring(_e-_s))

_s=os.clock()
for i=1, max_count do
  res = check3(test_table1, str)
end
_e = os.clock()
print("check3 took "..tostring(_e-_s))   
--[[ 
check1 took 0.752
check2 took 0.261
check3 took 0.116 
--]] 
 
Цитата
Michael Bulychev пишет:
os.clock()
насколько корректны показания этого os.clock? Михаил, уж Вы-то, постеснялись бы по нему показания сверять))))
 
Цитата
sam063rus пишет:
Цитата
Michael Bulychev пишет:
os.clock()
насколько корректны показания этого os.clock? Михаил, уж Вы-то, постеснялись бы по нему показания сверять))))
Добрый день.
Вы сейчас о чем?
 
а то Вы не понимаете?... )))

показания на основе os.clock - каждый раз, разные и сильно варьируются.
 
В данном примере это не критично.
 
Michael Bulychev, спасибо за примеры!
Ваши function check1(t, str) и function check3(t, str) замечательны тем, что их даже не обязательно оформлять в виде отдельных функций, а операторы из них можно непосредственно использовать в нужном месте основной программы.

Вот только не очень понял про таблицу test_table1={["qwe"]=true, ["1qweasd"]=true, ["zxc"]=true} Здесь значения строк используются в качестве индексов элементов таблицы?
Если так, то можно вместо набора столь мудреной конструкции вручную получить эту таблицу из test_table следующим образом?

Код
test_table1 = {}
for k, v in pairs(test_table) do
  test_table1[v] = true
end
 
 
Эти примеры я привел к тому, что не всегда более длинный код работает медленнее. А пример с test_table1 показывает что заранее продуманный способ хранения данных позволяет выиграть и в размере кода и в скорости работы.
Если у Вас стоит задача в таблице сохранять строки а затем проверять их наличие, то третий способ самый оптимальный. Используйте строки в качестве ключа таблицы. Это дает максимальную скорость при минимальном количестве кода.
 
А приведенный мною код позволит получить из таблицы test_table таблицу test_table1 ?

Код
test_table1 = {}
for k, v in pairs(test_table) do
  test_table1[v] = true
end
 
 
Да, позволит.
 
Цитата
Michael Bulychev пишет:
Да, позволит.
Если у первой таблицы нет метаметодов.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru пишет:
Если у первой таблицы нет метаметодов.
Таких слов я еще не знаю, так что наверняка нет  :D
 
Цитата
sam063rus пишет:
показания на основе os.clock - каждый раз, разные и сильно варьируются.
А почему так происходит?
И насколько сильно варьируются (в разы или все же разницу можно измерять процентами)?
 
Цитата
Дмитрий пишет:
И насколько сильно варьируются (в разы или все же разницу можно измерять процентами)?
А это зависит от величины измеряемого интервала времени. Если не ошибаюсь, погрешность измерения os.clock() может быть от 0.5 до 15 мс.
Надо делать так, как надо. А как не надо - делать не надо.
 
Хотя, наверное, не так. Учитывая, что при вычислении интервала времени между двумя событиями необходимо два измерения, то погрешность может составлять до 30 мс.
Надо делать так, как надо. А как не надо - делать не надо.
 
15 миллисекунд - это интервал обновления времени в операционной системе?
Страницы: 1
Читают тему
Наверх