Как можно эффективно достичь строковых индексированных массивов PHP в C ++ - PullRequest
1 голос
/ 07 ноября 2011

Я поиграл с поиском текста в больших списках и обнаружил, что использование массива PHP кажется быстрым способом сделать это.

Например, если у вас было множество топонимов и связанных почтовых индексов, выможет прочитать их в массив PHP следующим образом:

$place[‘place name here’] = “postcode”;

Затем, чтобы посмотреть вверх, просто займите место, которое вы хотите найти, и подключите его к массиву:

$postcode_sought = $place[‘place I want to look up’];

Я думал, что мог бы ускорить это с помощью C ++, но, конечно, C ++ не позволяет (насколько я знаю) массивы со строкой в ​​качестве индекса.

Единственный способ, который я могу себе представить, - это создать векторы для места и почтовый индекс и перебрать вектор места в поисках совпадения, но повторные сравнения строк будут длиться вечно, как я и ожидал.Я также экспериментировал с хэшированием текста, но все еще не мог получить его так быстро, как PHP.

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

Заранее спасибо.C

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Я думал, что смогу ускорить это с помощью C ++, но, конечно, C ++ не позволяет (насколько мне известно) массивы со строкой в ​​качестве индекса.

Да, Вы можете использовать std :: map в качестве ассоциативного массива.

0 голосов
/ 07 ноября 2011

C и C ++ допускают, чтобы целочисленные типы были только индексами массива, а строки даже не являются типами в C / C ++, на самом деле они представляют собой массив символов.
Как указано выше, используйте std::map или аналогичный.

0 голосов
/ 07 ноября 2011

Вы можете попробовать использовать Berkeley DB.В те времена он был самым быстрым, но по умолчанию он ориентирован на диск.Я не знаю, можете ли вы запустить его в памяти, но вы всегда можете смонтировать каталог из tmpfs.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...