Вложенные циклы. Как их обойти?
Каждый знак строки 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 строк.
А что касается вложенного цикла, то можно определять соответствие не перебором до обнаружения такой же буквы, а вычисляя индекс в массиве по коду символа.
On 2002-09-09 0908, Ampersand wrote
Можно оптимизировать время перебора, расположив элементы в массивах в порядке убывания вероятности их появления.
А что касается вложенного цикла, то можно определять соответствие не перебором до обнаружения такой же буквы, а вычисляя индекс в массиве по коду символа.
тогда ламерский вопрос, как заменить индексы массива, если это можно вобще?. Т.е вместо 0.....66 на, к примеру, aa, ab, ac, ad......zy, zz. Если это возможно, то надобность во вложенном цикле отпадёт сама собой.
И второй вопрос. Есть ли в Ява Скрипт функция, которая выдаёт индекс элемента массива по его знаению...т.е, к примеру,
var x="";
myarray[5]="five";
x=myarray[5];
в резултате имеем x ="five";
так как бы так наоборот, не его значение получить, а написать чёнить такое, что получиться
x=5;
другими словами - получить индекс некоего элемента массива по его значению. Тогда тоже отпадает надобность во вложенном цикле.
И сразу же второй вопрос.
Не пожскажете йункцию, если такая есть в Ява Скрипт, для работы с HEX кодами. Или может есть у кого калькулятор на Яве для этого дела. Или просто алгоритм скажите, а то я последний раз с этим давно очень встречалася ))...спасибо
[ Это Сообщение было отредактировано kindoro в 2002-09-09 2022 ]
[ Это Сообщение было отредактировано kindoro в 2002-09-09 2023 ]
mas = new Array();
mas['a'] = 'A';
mas['b'] = 'B';
.....
document.write(mas['a']); // выводит A
Можно и mas['eny'] = 'что угодно', т.к. ведет себя как обычный ассоциативный массив.
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], без кавычек, вот оно и не работало. ))
сенкс.