2013-03-17 3 views
2

Я использую следующий код, чтобы вывести определение слова из файла с разделителями табуляции только с двумя столбцами (слово, определение). Это самый эффективный код для того, что я пытаюсь сделать?PHP - наиболее эффективный код словаря

<?php 
$haystack = file("dictionary.txt"); 
$needle = 'apple'; 

$flipped_haystack = array_flip($haystack); 

foreach($haystack as $value) 
    { 
    $haystack = explode("\t", $value); 

    if ($haystack[0] == $needle) 
     { 
     echo "Definition of $needle: $haystack[1]"; 
     $defined = "1"; 
     break; 
     } 
    } 

if($defined != "1") 
    { 
    echo "$needle not found!"; 
    } 
?> 
+1

Насколько он медленный? Вы сталкиваетесь с проблемами? –

+0

@RichBradshaw В настоящее время это не медленно или проблематично, потому что у меня есть только несколько записей, но я собираюсь создать 100 000 записей. – Pamela

+0

Почему бы не создать подобный размерный набор данных случайным образом (например, строка может быть «sdfkjalwerjkl 8yuoayisyfiuh2342 asdkfh kdh slfk jsfhalsdkjf» или что бы то ни было, тогда попробуйте свой код на этом - если это медленно, то это достойное место, чтобы потратить ваше время - если это не так, тогда проблема решена! :) Использование trie - это «правильный путь», но 100 000 - это не много данных. –

ответ

5

Прямо сейчас вы делаете много бессмысленной работы

1) load the file into a per-line array 
2) flip the array 
3) iterate over and explode every value of the array 
4) test that exploded value 

Вы не можете избежать шага 1, но почему вы должны сделать все, что бесполезно «заняты работой» для 2 & 3?

например. если ваш словарь текст был создан что-то вроде этого:

word:definition 

то простой:

$matches = preg_grep('/^$word:(.*)$/', $haystack); 

будет делать трюк для вас, с гораздо меньшим количеством кода.

+0

Спасибо, но это не работает для меня. Я делаю что-то неправильно? '\t '(Я не могу заставить код уценки работать.) – Pamela

+1

' ('/^$ needle: (. *) $ /' 'Должно быть' ("/^$ needle :(. *) $/"'. (Используйте обратные ключи (') вокруг кода.) –

+0

Спасибо, сейчас работает. Это намного эффективнее, чем я изначально. Спасибо, что помогли мне узнать что-то новое. – Pamela

2

No. Скорее всего Trie является более эффективным, и вы не сортировать словарь и он не использует бинарное дерево или троичное дерево. Я думаю, если вам нужно искать в огромном словаре, ваш метод просто слишком медленный.

+0

Чтобы добавить, это определенно зависит от того, насколько велики словаря.txt и как его организовано. Текущий алгоритм устраняет только одну возможность на итерацию, что делает ее чрезвычайно медленной. –

+0

@NicholasPickering dictionary.txt в алфавитном порядке. В конечном итоге у него будет 100 000 записей. Какой был бы лучший способ использования, чем то, что я сейчас использую? – Pamela

+0

@phpdna Спасибо, это мой первый прослушивание trie's, но это, безусловно, то, что я буду изучать, чтобы увидеть, что все может быть достигнуто с помощью trie. – Pamela

2

Это самый эффективный код для того, что я пытаюсь сделать?

Наверняка нет.
Только для поиска Игла, которую вы обрабатываете всего записей.

Я буду строить до 100 000 записей.

используйте базу данных, затем.