Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вложенные циклы. Как их обойти?

559
09 сентября 2002 года
kindoro
20 / / 20.06.2000
Вот у меня тут назрел вопрос. Назрел по Java Script, но такая же проблема в любом другом языке програмирования. ПРоблема во вложеных циклах и их длительной работе. У меня в скрипте есть один вложенный цикл for. Это из функции для своеобразной расшифровки.
Каждый знак строки stroka надо сравнить с каждым элементом массива знаков latin, если они похжи, то взять из массива знаков rus соотв знак(аргумент), того же номера, что и найденый в latin и поменять текущий знак в stroka на соответствующий ему знак из массива rus . Работает по принципу перевода из русского в траслит, то есть "а" в "а", "б" в "b", "в" в "v" итд.
Но с некоторой разницею. Так вот. Есть два массива latin и rus. В latin заширванные знаки, в rus их расшивровка. Оба массива одинаковой длинны - 66(кол-во букв в русском алфавите для обоих регистров). Порядковые номера аргументов служат единым кодом, равным для обоих массивов. Т.е. для у знака latin[24] есть эквивалент в rus[24]. Теперь сама телега. Выглядит вложенный цикл так

for (i = 0; i < stroka.length; i++)
{
for (j = 0; j < latin.length; j++)
{
.....statement.....
}

}
в statement происходит следующее

Сравнить знак stroka.charAt(i) с элементом массива latin[j].

Если они похожи то
{
взять из массива знак rus[j], т.е. тот, который и предопределён для этого текущего символа stroka.charAt(i), и записать этот знак в конец временной строки tempStr.
}
если не похожи, то перейти к следующему j.

Строка tempStr в конце будет выданна функцией как результат.

Вся непитнсот состоит в том, что массивы сами по себе не маленькие - 66 аргументов, да ещё и входная строка stroka порядка 200 символов, итого 13200 сравнений, в худшем случае, если при переборе массива окажеться, что зашифврованный знак в самом конце массива. Так в цикле с j конечно стоит break, но от этого не намного легче.....у меня это всё просиходит довольно долго. Да плюс к тому, что вся эта телега, вся эта йункция расшивроки будет потом, в свою очередь, тоже вызванна циклом, и делаться ешё 20 раз. Выходит что 264000 операции сравнения в том же самом плохом члучае, когда надо добираться при переборе массива latin до самого последнего знака.
Так вот мне интересно, как можно избегать таких вложенных циклов. Ведь как-то это делаеться. Если я не достаточно ясно выразл ситуацию тут, то с позволения модератора выдожу тут полный код функции. Это примерно 50 строк.
543
09 сентября 2002 года
Ampersand
75 / / 20.06.2000
Можно оптимизировать время перебора, расположив элементы в массивах в порядке убывания вероятности их появления.
А что касается вложенного цикла, то можно определять соответствие не перебором до обнаружения такой же буквы, а вычисляя индекс в массиве по коду символа.
453
09 сентября 2002 года
amonra
60 / / 20.08.2000
Не пробовал но появилась тккая идея почему не попробовать иметь массивы не 1..66 а начиная с индекса равного коду символа в ACSII таблице то можно просто воспользоваться фукцией которая будет выдавать код в указаной таблице зная сам символ навернека такая функция есть у ты избавишся от первоко цикла надеюсь если реализация будет отличаться от моей по мой ответ тебе поможет
559
09 сентября 2002 года
kindoro
20 / / 20.06.2000
Цитата:

On 2002-09-09 0908, Ampersand wrote
Можно оптимизировать время перебора, расположив элементы в массивах в порядке убывания вероятности их появления.
А что касается вложенного цикла, то можно определять соответствие не перебором до обнаружения такой же буквы, а вычисляя индекс в массиве по коду символа.



тогда ламерский вопрос, как заменить индексы массива, если это можно вобще?. Т.е вместо 0.....66 на, к примеру, aa, ab, ac, ad......zy, zz. Если это возможно, то надобность во вложенном цикле отпадёт сама собой.
И второй вопрос. Есть ли в Ява Скрипт функция, которая выдаёт индекс элемента массива по его знаению...т.е, к примеру,

var x=&quot;&quot;;
myarray[5]=&quot;five&quot;;
x=myarray[5];
в резултате имеем x =&quot;five&quot;;

так как бы так наоборот, не его значение получить, а написать чёнить такое, что получиться

x=5;
другими словами - получить индекс некоего элемента массива по его значению. Тогда тоже отпадает надобность во вложенном цикле.

И сразу же второй вопрос.
Не пожскажете йункцию, если такая есть в Ява Скрипт, для работы с HEX кодами. Или может есть у кого калькулятор на Яве для этого дела. Или просто алгоритм скажите, а то я последний раз с этим давно очень встречалася ))...спасибо

[ Это Сообщение было отредактировано kindoro в 2002-09-09 2022 ]

[ Это Сообщение было отредактировано kindoro в 2002-09-09 2023 ]

543
10 сентября 2002 года
Ampersand
75 / / 20.06.2000
У меня так получилось

mas = new Array();
mas['a'] = 'A';
mas['b'] = 'B';
.....
document.write(mas['a']); // выводит A

Можно и mas['eny'] = 'что угодно', т.к. ведет себя как обычный ассоциативный массив.
559
11 сентября 2002 года
kindoro
20 / / 20.06.2000
Цитата:

On 2002-09-10 0856, Ampersand wrote
У меня так получилось

mas = new Array();
mas['a'] = 'A';
mas['b'] = 'B';
.....
document.write(mas['a']); // выводит A

Можно и mas['eny'] = 'что угодно', т.к. ведет себя как обычный ассоциативный массив.



во, точно ). я тоже проовал такойо сделать массивчик, толкьол индек вводил прям так...т.е my[a], без кавычек, вот оно и не работало. ))
сенкс.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог