Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / давайте тут пооптимизируем на тему транслита :) / 10 сообщений из 10, страница 1 из 1
26.01.2005, 11:32
    #32884069
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
исходный топик - http://www.sql.ru/forum/actualthread.aspx?tid=154645

напомню, что обсуждались алгоритмы транслита и их скорость.
конечно, предложенный мной - самый тупой (в лоб), имеет два
цикла (причем один вложен в другой) и исполняется достаточно
долго.

далее следовал алгоритм с использованием Hashtable.

я предлагаю еще один :) написан и исполнен с одного раза, т.е. имеет место
оптимизация.

для начала определимся, что 'А' = 1040 (русская), 'Я' = 1071, вся
последовательность алфавита постоянная (за исключением 'Ё' = 1025).
для строчных букв: 'а' = 1072 ... 'я' = 1103, 'ё' = 1105.

код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
 package  test;

/**
 * author: афтар<br/>
 * package: test<br/>
 * date:    26.01.2005<br/>
 */
 public   class  TestTranslit {
   public   static   void  main(String[] args) {
    String test = "мама xyz сшила мне штаны qwer и срать хотела ty на меня значит я гад паршивый и ничего не кушал с утра";
     long  st = System.currentTimeMillis();
    String translit =  null ;
     for  ( int  i =  0 ; i <  100000 ; i++) {
      translit = toTranslit1(test);
    }
     long  ct = System.currentTimeMillis();
    System.out.println((ct - st) + ", " + translit);

    st = System.currentTimeMillis();
    translit =  null ;
     for  ( int  i =  0 ; i <  100000 ; i++) {
      translit = toTranslit2(test);
    }
    ct = System.currentTimeMillis();
    System.out.println((ct - st) + ", " + translit);
  }

   static  String[] f = {"А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ч", "Ц", "Ш", "Щ", "Э", "Ю", "Я", "Ы", "Ъ", "Ь", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ч", "ц", "ш", "щ", "э", "ю", "я", "ы", "ъ", "ь"};
   static  String[] t = {"A", "B", "V", "G", "D", "E", "Jo", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "Ch", "C", "Sh", "Csh", "E", "Ju", "Ja", "Y", "`", "'", "a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "ch", "c", "sh", "csh", "e", "ju", "ja", "y", "`", "'"};

   private   static  String toTranslit1(String src) {
     if  (src ==  null ) {
       return  "";
    }
    StringBuffer res =  new  StringBuffer();

     for  ( int  i =  0 ; i < src.length(); ++i) {
      String add = src.substring(i, i +  1 );
       for  ( int  j =  0 ; j < f.length; j++) {
         if  (f[j].equals(add)) {
          add = t[j];
           break ;
        }
      }
      res.append(add);
    }

     return  res.toString();
  }

   static  String[] Echars = {"A", "B", "V", "G", "D", "E", "Zh", "Z", "I", "J", "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "H", "C", "Ch", "Sh", "Csh", "`", "Y", "'", "E", "Ju", "Ja"};
  static String[] echars = {"a", "b", "v", "g", "d", "e", "zh", "z", "i", "j", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", "sh", "csh", "`", "y", "'", "e", "ju", "ja"};
   private   static  String toTranslit2(String src) {
     if  (src ==  null  || src.trim().length() ==  0 ) {
       return   new  String();
    }

    StringBuffer srcb =  new  StringBuffer(src);
    StringBuffer dstb =  new  StringBuffer(src.length());

     int  cs;
     for  ( int  i =  0 ; i < srcb.length(); i++) {
      cs = srcb.charAt(i);
       switch  (cs) {
         case   1025 :
          dstb.append("Jo");
           break ;
         case   1105 :
          dstb.append("jo");
           break ;
         default :
           if  (cs >=  1040  && cs <=  1071 ) {
            dstb.append(Echars[cs -  1040 ]);
          }  else   if  (cs >=  1072  && cs <=  1103 ) {
            dstb.append(echars[cs -  1072 ]);
          }  else  {
            dstb.append(( char )cs);
          }
      }
    }

     return  dstb.toString();
  }
}

toTransli1() - тот код, который приводил я ранее,
toTranslit2() - еще раз предлагаю :)

результаты:

7718, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
1578, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra

как видим, оба текста транслит делают, оставляя латинские буквы
латинскими. время выполнения - 7718 мс и 1578 мс

фпирёт! как говориться :)


PS да. предлагаю отталкиваться от чего-то общего при замерах времени
исполнения. пусть это будет toTranslit2(). число выполнений метода
пусть будет 100000.

--
Lacrima Mosa Est
...
Рейтинг: 0 / 0
26.01.2005, 13:39
    #32884601
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
А почему не тестировался вариант с hashtable? %)
...
Рейтинг: 0 / 0
26.01.2005, 13:52
    #32884665
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
    private   static  String toTranslit3(String src) {
         if  (src ==  null  || src.trim().length() ==  0 ) {
             return  "";
        }

         char [] chars;
        src.getChars( 0 , src.length(), chars =  new   char [src.length()],  0 );

         char [] dest =  new   char [chars.length *  3 ];
         int  destPos =  0 ;

         int  c;
         for  ( int  i =  0 ; i < chars.length; i++) {
            c = chars[i];
             switch  (c) {
                 case   1025 :
                    dest[destPos++] = 'J';
                    dest[destPos++] = 'o';
                     break ;
                 case   1105 :
                    dest[destPos++] = 'j';
                    dest[destPos++] = 'o';
                     break ;
                 default :
                     if  (c >=  1040  && c <=  1071 ) {
                        String echar = Echars[c -  1040 ];
                         for  ( int  j =  0 ; j < echar.length(); j++) {
                            dest[destPos++] = echar.charAt(j);
                        }
                    }  else   if  (c >=  1072  && c <=  1103 ) {
                        String echar = echars[c -  1072 ];
                         for  ( int  j =  0 ; j < echar.length(); j++) {
                            dest[destPos++] = echar.charAt(j);
                        }
                    }  else  {
                        dest[destPos++] = ( char )c;
                    }
            }
        }

         return   new  String(dest,  0 , destPos);
    }


Код: plaintext
1.
2.
3.
 14342 , mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
1833, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
 440 , mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
...
Рейтинг: 0 / 0
26.01.2005, 13:58
    #32884683
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
Вариант с hashmap:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
(c) avtor topika
public static String toTranslit4(String src) {
           StringBuffer res = new StringBuffer();
           for (int i =  0 ; i < src.length(); ++i) {
               if (dic.get(src.subSequence(i, i +  1 )) != null) {
                   res.append(dic.get(src.subSequence(i, i +  1 )));
               } else {
                   res.append(src.subSequence(i, i +  1 ));
               }
           }
           return res.toString();
       }

5188, mama xyz sshila mne shtany qwer i srat' hotela ty na menja znachit ja gad parshivyj i nichego ne kushal s utra
...
Рейтинг: 0 / 0
26.01.2005, 14:38
    #32884825
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)
...
Рейтинг: 0 / 0
26.01.2005, 15:24
    #32884984
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
Я put в экселе делал, потом табы на "" меняешь и всё.
...
Рейтинг: 0 / 0
26.01.2005, 15:52
    #32885068
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
А.Грасоff™ NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)

Cтранно.
У ты на чём запускал?
14000 и 7000 это большая разница для одного и того же теста :)
...
Рейтинг: 0 / 0
26.01.2005, 16:22
    #32885177
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
NotGonnaGetUs А.Грасоff™ NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)

Cтранно.
У ты на чём запускал?
14000 и 7000 это большая разница для одного и того же теста :)

P4 2GHz, 512 RAM, Win 2000 SP4
...
Рейтинг: 0 / 0
26.01.2005, 17:22
    #32885408
NotGonnaGetUs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
А.Грасоff™ NotGonnaGetUs А.Грасоff™ NotGonnaGetUsА почему не тестировался вариант с hashtable? %)
лень было ...put(); делать :)

Cтранно.
У ты на чём запускал?
14000 и 7000 это большая разница для одного и того же теста :)

P4 2GHz, 512 RAM, Win 2000 SP4

Лол.
P4 2.4, 768, win2k sp4, java 1.4.2_06/1.5.0_01.
Первый тест всегда около 14-15с.

Почему так получается?
...
Рейтинг: 0 / 0
27.01.2005, 13:17
    #32886880
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
давайте тут пооптимизируем на тему транслита :)
Вот еще вариант. Быстрее процентов на 20.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
  // Cyrillic 0x400-0x4FF
  static String[] UnicodeCyrillic2Translit= new String[] {

  //      0     1     2     3     4     5     6     7     8     9    a   b   c   d   e   f

	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x40?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x41?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x42?
	"a",".","v","g","d","e",".","z","i","j","k","l","m","n","o","p", // 0x43?
	"r","s","t","u",".","h",".","ch","sh",".",".","y","'",".",".","ja",// 0x44?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x45?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x46?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x47?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x48?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x49?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4a?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4b?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4c?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4d?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".",".", // 0x4e?
	".",".",".",".",".",".",".",".",".",".",".",".",".",".",".","."  // 0x4f?
  };

  private static String toTranslit5(String src) {

    if (src == null || src.trim().length() == 0) {
      return new String();
    }

    StringBuffer dstb = new StringBuffer(src.length());

    for(int i=0;i<src.length();i++)
    {
	short c_code=(short)src.charAt(i);
	if ((c_code>=0x0400)&&(c_code<0x04FF)) {dstb.append(UnicodeCyrillic2Translit[c_code-0x0400]);continue;}
	if (c_code<0x80) {dstb.append((char)c_code);continue;}
	dstb.append('?');		
    }

    return dstb.toString();
  }


Табличку всю мне было лень заполнять так что извиняйте.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / давайте тут пооптимизируем на тему транслита :) / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]