Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ассоциация номера телефона со словами 
:(
    Опции темы
Gold Dragon
Дата 19.1.2012, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



В одной из тем про "как обрабатывать телефонный номер" возникла идея сделать ассоциацию со словами, т.е. чтобы лучше запомнить телефон.

Вот я тут начал было реализовывать, но никак не могу понять логику как подбирать слова. Вот что получает 
у нас есть десять цифр. Единица и ноль не имеют букв (рассматриваем раскладку на сотовых телефонах)
Единицу я планирую заменить на "минус", а ноль на "плюс"
Значит  мы можем номера делить на слова если в номере будут эти цыфры.

далее есть
2 - а,б,в,г
3 - д,е,ё,ж,з
4 - и,й,к,л
5 - м,н,о,п
6 - р,с,т,у
7 - ф,х,ц,ч
8 - ш,щ,ь,ы,ъ
9 - э,ю,я

а также есть таблицы с русскими словами (у меня получилось около 99 тысяч) где есть само слово и сколько в нём букв.  Хотя нужно будет выкинуть слова больше 10 букв 

а вот теперь сижу ине могу понять как осуществить перебор словаря и выдать все возможные варианты

Жду идей ;)





--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 20.1.2012, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



сотовые номера начинаются с 8 или 7 (у нас), то есть слова будут начинаться на ф,х,ц,ч,ш,щ,ь,ы,ъ
как много таких слов?


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 20.1.2012, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



телефонные номера у нас начинаются с кода оператора или кода региона smile а 8 или +7 это всего-лишь код для выхода в междугороднюю или международную сеть.. 

Цитата(MoLeX @  20.1.2012,  07:23 Найти цитируемый пост)
как много таких слов? 

в том словаре который у меня
ф - 1512
х - 1045
ц - 509 
ч - 952
ш - 1231
щ - 179
ы, ь,ъ - понятное дело нет

так что можно выбрать  smile Конечно не все номера будут иметь "красивые слова", но суть вопроса другая..

Сейчас пытаюсь всё это дело реализовать через прогон массивов. Но видимо это не самый оптимальный вариант.. Зато будет от чего отталкиваться.. 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 20.1.2012, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



1. надо бы составить правила формирования слов (три ффф подряд не могут быть и т.д.)
2. проверка по словарю

Добавлено через 48 секунд
как я пока вижу решение: формируем все возможные комбинации, с учетом правил (п. 1), и делаем проверку. в итоге мы можем получить несколько вариантов


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 20.1.2012, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



так, значит условия должны быть следующими

- слово не должно содержать три повторяющиеся буквы
- наверное нет смысла когда 1 или 0 тоже три идут подряд
- разбить телефон на слова, т.е. по 1 или 0
- не начинать слова с Ь,Ъ,Ы

вот простой перебор в который нужно вставить эти условия...

Код

$telephon = '8356746472';
$assn = array();
$assn[0] = array('+');
$assn[1] = array('-');
$assn[2] = array('а', 'б', 'в', 'г');
$assn[3] = array('д', 'е', 'ё', 'ж', 'з');
$assn[4] = array('и', 'й', 'к', 'л');
$assn[5] = array('м', 'н', 'о', 'п');
$assn[6] = array('р', 'с', 'т', 'у');
$assn[7] = array('ф', 'х', 'ц', 'ч');
$assn[8] = array('ш', 'щ', 'ъ', 'ы', 'ь');
$assn[9] = array('э', 'ю', 'я');
foreach ($assn[$telephon[0]] as $letter0) {
    foreach ($assn[$telephon[1]] as $letter1) {
        foreach ($assn[$telephon[2]] as $letter2) {
            foreach ($assn[$telephon[3]] as $letter3) {
                foreach ($assn[$telephon[4]] as $letter4) {
                    foreach ($assn[$telephon[5]] as $letter5) {
                        foreach ($assn[$telephon[6]] as $letter6) {
                            foreach ($assn[$telephon[7]] as $letter7) {
                                foreach ($assn[$telephon[8]] as $letter8) {
                                    foreach ($assn[$telephon[9]] as $letter9) {
                                        //echo $letter0.$letter1.$letter2.$letter3.$letter4.$letter5.$letter6.$letter7.$letter8.$letter9.'<br>';
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

сам перебор без вывод при карсимальновозможной комбинации составляет меньше секунды (думал будет значительно больше)



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



38попугаев ( [8]385 556 223 )- это хороший номер?

Зачем игнорировать цифры? 
Цитата(Gold Dragon @  20.1.2012,  08:49 Найти цитируемый пост)
сам перебор без вывод при карсимальновозможной комбинации составляет меньше секунды

Осталось вставить туда условие и ужаснуться  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  20.1.2012,  10:02 Найти цитируемый пост)
38попугаев ( [8]385 556 223 )- это хороший номер?
а что ты предлагаешь? Как такое обработать?




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  20.1.2012,  09:14 Найти цитируемый пост)
а что ты предлагаешь?

добавить в assn[X] еще и соответствующую цифру. Резать на слова по 0,1 и цифрам




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
krundetz
Дата 20.1.2012, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Gold Dragon @  19.1.2012,  18:27 Найти цитируемый пост)
а вот теперь сижу ине могу понять как осуществить перебор словаря и выдать все возможные варианты

Я бы поместил словарь в бд, после чего делал бы выборку по таблице, и в PHP скрипте обрабатывал бы только уже ответ БД.

Это сообщение отредактировал(а) krundetz - 20.1.2012, 09:33


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Gold Dragon
Дата 20.1.2012, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  20.1.2012,  10:26 Найти цитируемый пост)
добавить в assn[X] еще и соответствующую цифру
так тогда в словари это нужно занести

Цитата(krundetz @  20.1.2012,  10:32 Найти цитируемый пост)
Я бы поместил словарь в бд, после чего делал бы выборку по таблице, и в PHP скрипте обрабатывал бы только уже ответ БД.
так я так и сделал.. Вопрос в другом, как сделать саму выборку?

если одно слово, т.е. нет ни 1 ни 0 то это самый простой перебор (уже показал код).. Но ведь нужноделить по словам ещё и искать каждое слово.. Вот как тут с этими вложенными циклами быть?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  20.1.2012,  09:52 Найти цитируемый пост)
так тогда в словари это нужно занести

Зачем? слова в словаре состоят из букв. Просто некоторые слова могут соединяться цифрами


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(ksnk @  20.1.2012,  11:10 Найти цитируемый пост)
Просто некоторые слова могут соединяться цифрами 
это не реально автоматом делать..

Добавлено через 4 минуты и 1 секунду
кстати, есть слова с тире.. тогда нужно сначала делить по "0", и если слова не найдуться, то потом ещё и по "1"


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.1.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Gold Dragon @  20.1.2012,  09:52 Найти цитируемый пост)
Вопрос в другом, как сделать саму выборку?

ну я предлагаю делать саму выборку единым запросом к таблице, то есть все сведется к составление запроса

для составления самих же комбинаций подставляемых в запрос ИМХО перебор не лучшей вариант, думаю здесь возможно использование побитового сдвига 

Это сообщение отредактировал(а) krundetz - 20.1.2012, 11:09


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Gold Dragon
Дата 20.1.2012, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(krundetz @  20.1.2012,  12:07 Найти цитируемый пост)
думаю здесь возможно использование побитового сдвига 
пример?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(krundetz @  20.1.2012,  11:07 Найти цитируемый пост)
ну я предлагаю делать саму выборку единым запросом к таблице, то есть все сведется к составление запроса

На генерацию исходных данных для запроса УЖЕ уходит примерно секунда. Сколько будет выполняться сам запрос отдельная и не простая песня.
Вероятно, нужно применять более навороченную математику и, возможно, более быстрый инструмент.
Хотя прикинуть сложность и реализуемость алгоритма можно, наверное, и на php


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ну так кто-нибудь попробует описать свой алгоритм ?  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
krundetz
Дата 20.1.2012, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(Gold Dragon @  20.1.2012,  11:16 Найти цитируемый пост)
пример?

попробую привести вечерком, если получиться реализовать, так как остались смутные воспоминания ещё с университетских времен
Цитата(ksnk @  20.1.2012,  11:26 Найти цитируемый пост)
На генерацию исходных данных для запроса УЖЕ уходит примерно секунда.

как раз по этому и предлагаю перенести на сторону БД, так как на PHP логика будет намного медленее

также возможно стоит глянуть в сторону теории конечных автоматов

Это сообщение отредактировал(а) krundetz - 20.1.2012, 12:20


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Gold Dragon
Дата 20.1.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(krundetz @  20.1.2012,  13:12 Найти цитируемый пост)
также возможно стоит глянуть в сторону теории конечных автоматов
это что такое?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 20.1.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



в общем представляю суперстрашный код smile но от чего-то нужно отталкиваться

таблица
Код

CREATE TABLE IF NOT EXISTS `dictionary` (
  `word` varchar(10) NOT NULL,
  `num_ler` tinyint(2) NOT NULL,
  PRIMARY KEY (`word`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


ну и сам код
Код

$time_start = getmicrotime();

$result = '';
$telephon = '4552033642';
$assn = array();
$word_ar = array();

$assn[0] = array('+');
$assn[1] = array('-');
$assn[2] = array('а', 'б', 'в', 'г');
$assn[3] = array('д', 'е', 'ё', 'ж', 'з');
$assn[4] = array('и', 'й', 'к', 'л');
$assn[5] = array('м', 'н', 'о', 'п');
$assn[6] = array('р', 'с', 'т', 'у');
$assn[7] = array('ф', 'х', 'ц', 'ч');
$assn[8] = array('ш', 'щ', 'ъ', 'ы', 'ь');
$assn[9] = array('э', 'ю', 'я');

$word_array = explode('0', $telephon);

foreach ($word_array as $word) {
    switch(strlen($word)){
        case 2:
            $word_ar[2] = letter_2($assn, $word);
            break;
        case 3:
            $word_ar[3] = letter_3($assn, $word);
            break;
        case 4:
            $word_ar[4] = letter_4($assn, $word);
            break;
        case 5:
            $word_ar[5] = letter_5($assn, $word);
            break;
        case 6:
            $word_ar[6] = letter_6($assn, $word);
            break;
        case 7:
            $word_ar[7] = letter_7($assn, $word);
            break;
        case 8:
            $word_ar[8] = letter_8($assn, $word);
            break;
        case 9:
            $word_ar[9] = letter_9($assn, $word);
            break;
        case 10:
            $word_ar[10] = letter_10($assn, $word);
            break;
    }
    if (strlen($word) == 5) {
    }
}

function letter_2($assn, $word){
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            $tmp = getWord($letter0 . $letter1);
            if ($tmp) {
                $result[] = $tmp;
            }
        }
    }
    return $result;
}

function letter_3($assn, $word){
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                $tmp = getWord($letter0 . $letter1 . $letter2);
                if ($tmp) {
                    $result[] = $tmp;
                }
            }
        }
    }
    return $result;
}
function letter_4($assn, $word){
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3);
                    if ($tmp) {
                        $result[] = $tmp;
                    }
                }
            }
        }
    }
    return $result;
}

function letter_5($assn, $word){
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    foreach ($assn[$word[4]] as $letter4) {
                        $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3 . $letter4);
                        if ($tmp) {
                            $result[] = $tmp;
                        }
                    }
                }
            }
        }
    }
    return $result;
}

function letter_6($assn, $word) {
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    foreach ($assn[$word[4]] as $letter4) {
                        foreach ($assn[$word[5]] as $letter5) {
                            $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3 . $letter4 . $letter5);
                            if ($tmp) {
                                $result[] = $tmp;
                            }
                        }
                    }
                }
            }
        }
    }
    return $result;
}

function letter_7($assn, $word) {
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    foreach ($assn[$word[4]] as $letter4) {
                        foreach ($assn[$word[5]] as $letter5) {
                            foreach ($assn[$word[6]] as $letter6) {
                                $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3 . $letter4 . $letter5 . $letter6);
                                if ($tmp) {
                                    $result[] = $tmp;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return $result;
}

function letter_8($assn, $word) {
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    foreach ($assn[$word[4]] as $letter4) {
                        foreach ($assn[$word[5]] as $letter5) {
                            foreach ($assn[$word[6]] as $letter6) {
                                foreach ($assn[$word[7]] as $letter7) {
                                    $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3 . $letter4 . $letter5 . $letter6 . $letter7);
                                    if ($tmp) {
                                        $result[] = $tmp;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return $result;
}

function letter_9($assn, $word) {
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    foreach ($assn[$word[4]] as $letter4) {
                        foreach ($assn[$word[5]] as $letter5) {
                            foreach ($assn[$word[6]] as $letter6) {
                                foreach ($assn[$word[7]] as $letter7) {
                                    foreach ($assn[$word[8]] as $letter8) {
                                        $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3 . $letter4 . $letter5 . $letter6 . $letter7 . $letter8);
                                        if ($tmp) {
                                            $result[] = $tmp;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return $result;
}

function letter_10($assn, $word) {
    foreach ($assn[$word[0]] as $letter0) {
        foreach ($assn[$word[1]] as $letter1) {
            foreach ($assn[$word[2]] as $letter2) {
                foreach ($assn[$word[3]] as $letter3) {
                    foreach ($assn[$word[4]] as $letter4) {
                        foreach ($assn[$word[5]] as $letter5) {
                            foreach ($assn[$word[6]] as $letter6) {
                                foreach ($assn[$word[7]] as $letter7) {
                                    foreach ($assn[$word[8]] as $letter8) {
                                        foreach ($assn[$word[9]] as $letter9) {
                                            $tmp = getWord($letter0 . $letter1 . $letter2 . $letter3 . $letter4 . $letter5 . $letter6 . $letter7 . $letter8 . $letter9);
                                            if ($tmp) {
                                                $result[] = $tmp;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return $result;
}


var_dump($word_ar);

function getWord($str){
    $result = false;
    $sql = "SELECT * FROM `dictionary` WHERE `word` = '".$str."'";
    $r = mysql_query($sql);
    while ($row = mysql_fetch_object($r)) {
        $result = $row->word;
    }
    return $result;
}




$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "<hr>Время обработки: $time секунд";

function getmicrotime() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
MoLeX
Дата 20.1.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



надо что-то делать с этими форешами


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 20.1.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



а что?

в общем запустил я на проверку 10-значный номер без нулей - Лиса рухнула

2 - 0.03 сек
3 - 0.06 сек
4 - 0.16
5 - 0.67
6 - 2.59
7 - 12.88
8 - 51.46
9 - 253.73

Добавлено через 32 секунды
какие мысле есть ещё?

ps
утопическая идея получается  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Надо подойти с другой стороны.
Сделать словарь с поиском по буквам
Код

// слово - привет
$vocabulary=array(
...
   'п'=>array(... ,'р'=> array ( ...,'и'=> array ( ...,'в'=> array ( ...,'е'=> array ( ...,'т',=>null...)))))

));
)

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

Есть ли сторонние сервисы, хранящие словари в таком виде?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



а разве база данных это не быстрее сделает по индексному полю?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  20.1.2012,  15:43 Найти цитируемый пост)
а разве база данных это не быстрее сделает по индексному полю? 

Нет. Так как база будет перебирать все варианты, а их только генерировать с предварительной фильтрацией - 200 секунд.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



тогда я не понял твою логику...

Индекс в базе делает именно так же кажется.. видит "п" и сразу переходит к ним, видит вторую "о" и переходит к ним


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Gold Dragon @  20.1.2012,  15:52 Найти цитируемый пост)
Индекс в базе делает именно так же кажется.. видит "п" и сразу переходит к ним, видит вторую "о" и переходит к ним 

База sql? Тогда сначала нужно эти данные для перехода ей сгенерировать и подсунуть. Именно этим - генерацией данных для sql запроса  и занимался твой foreach-монстр 200 секунд.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



так, тогда чуть подробнее (лучше на примере) покажи что нужно делать


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Вечером продолжу, пока времени нет :(. 

Пока можно сделать словарь такой, о котором я говорил.

Для начала - нужно нарыть список слов. Поискав системы проверки орфографии - наткнулся где-то на ссылку на словарь hunspell - zip архив с плагином для непонятно чего.
Оттуда нам будет интересен файл ru_RU.dic - список слов, с указанием части речи. Он 2 mб, так что сами качайте. Слова в кодировке koi-8, так что без небольшого шаманства не получилось.

Код

<?
ini_set('memory_limit','256M');

$kw = array(
      128, 129, 130, 131, 132, 133, 134, 135, 136, 137
    , 138, 139, 140, 141, 142, 143, 144, 145, 146, 147
    , 148, 149, 150, 151, 152, 153, 154, 155, 156, 157
    , 158, 159, 160, 161, 162, 184, 164, 165, 166, 167
    , 168, 169, 170, 171, 172, 173, 174, 175, 176, 177
    , 178, 179, 180, 181, 182, 183, 184, 185, 186, 187
    , 188, 189, 190, 191, 254, 224, 225, 246, 228, 229
    , 244, 227, 245, 232, 233, 234, 235, 236, 237, 238
    , 239, 255, 240, 241, 242, 243, 230, 226, 252, 251
    , 231, 248, 253, 249, 247, 250, 222, 192, 193, 214
    , 196, 197, 212, 195, 213, 200, 201, 202, 203, 204
    , 205, 206, 207, 223, 208, 209, 210, 211, 198, 194
    , 220, 219, 199, 216, 221, 217, 215, 218);
     
$handle = fopen("ru_RU.dic", "rb");
$contents='';
$words=array();

$vocabular=array();

mkt();
while(!feof($handle )){
    $contents.= fread($handle, 1024);
   $words=preg_split("#(/\w+)?\s#",$contents );
    foreach($words as $w){
        $ptr=&$vocabular;
        for($i=0;$i<strlen($w);$i++){
            $c = ord($w[$i]);

            if ($c>128) {
                $c=chr($kw[$c-128]);
                if(!isset($ptr[$c])) $ptr[$c]=array();
                $ptr=&$ptr[$c];
            } else 
                break;

        }
    }
    $lastA=strrpos($contents,"\n");
    $contents=substr($contents,$lastA);
}
fclose($handle);
file_put_contents('hunspell.dic.php','<? return '
    .str_replace('    ',' ',
        str_replace('  ',' ',str_replace('  ',' ',
            str_replace('  ',' ',str_replace('  ',' ',
                var_export($vocabular,true)
        ))))).';');



простенький конвертер  smile 
множество str_replace вставлено от того, что var_export генерирует 41мб строку. После реплейса она становится в 13мб, что все-таки чуть поменьше, чем 40.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Gold Dragon
Дата 20.1.2012, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ksnk, ты прикололся? конвертер?  smile  А не пробовал просто воспользоваться к примеру Notepad++? ;)

Кстати, если нужно , то могу словари дать. Этот хиленький, всего на 14 тысяч слов.. у меня есть нормальный на 90 с лишним + примерно 50 с разными окончаниями (и кажется с жаргонизмами)

Это сообщение отредактировал(а) Gold Dragon - 20.1.2012, 18:53


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ksnk
Дата 20.1.2012, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

 
ini_set('memory_limit','256M');
function mktm(){
    static $tm ; $ttm = $tm ;$tm= microtime(1) ;
    return $tm-$ttm ;
} ; mktm();
echo 'memory before:'.memory_get_usage();
$vocab=include("hunspell.dic.php");
echo ',after:'.memory_get_usage().'<br>';

$result = '';
$telephon = '22263242666';//6662';//овес
$assn = array();
$assn[0] = array('+');
$assn[1] = array('-');
$assn[2] = array('а', 'б', 'в', 'г');
$assn[3] = array('д', 'е', 'ё', 'ж', 'з');
$assn[4] = array('и', 'й', 'к', 'л');
$assn[5] = array('м', 'н', 'о', 'п');
$assn[6] = array('р', 'с', 'т', 'у');
$assn[7] = array('ф', 'х', 'ц', 'ч');
$assn[8] = array('ш', 'щ', 'ъ', 'ы', 'ь');
$assn[9] = array('э', 'ю', 'я');

function nextNumber(&$voc,$x,$cnt,$result){
  global $assn,$telephon ;
  if($x>=$cnt){echo $result.'...<br>'; return; }
  $n=$telephon[$x];
  if(isset($voc['@'])){
        echo $result.'<br>'; 
  }
  foreach($assn[$n] as $c){// 29
    if(isset($voc[$c])){
        nextNumber(&$voc[$c],$x+1,$cnt,$result.$c);
    }
  }
}

for($i=0;$i<strlen($telephon )-3;$i++){// 29
    echo'<h3>'.$i.'</h3>'; 
    nextNumber($vocab,$i,strlen($telephon ),'');
}

printf(" we spent %f sec<br>",mktm());



Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  hunspell.dic.zip 265,40 Kb


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 20.1.2012, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



а вот результат. Довольно быстро... если не считать 70м памяти на словарь
Код

memory before:688440,after:68152696
0

аббревиатур...
агат
1

бар
бард
бас
2

ар
ареал
ас
буж
вуз
гуж
3

реал
сдвиг
тег
уж
4

закат
зал
5

6

карст...
картр...
карту...
карус...
кастр...
кауст...
ласт
7

ар
артр...
арту...
ас
астр...
аттр...
аут
аутс...
брус...
бур
бурс...
бурт...
буру...
бусс...
буст...
буту...
встр...
всту...
грус...
гурт...
густ...
гутт...
we spent 0.822292 sec


Это сообщение отредактировал(а) ksnk - 20.1.2012, 20:54


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2221 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.