контейнер для быстрого поиска имени

Я сфокусировался на одном методе тестирования из AccountingApiAccountsTest.

Я изменил базовый URL.

Я изменил значения CustomJsonConfig. Переменные, которые я модифицировал:

USER_AGENT CONSUMER_KEY CONSUMER_SECRET

Дайте мне знать что-нибудь еще.

Я получаю следующую ошибку

com.xero.api.XeroApiException: oauth_problem=token_rejected&oauth_problem_advice=Token%20L8HCWCM38WJOYQ2FYVPKH5XVILSH8A%20does%20not%20match%20an%20expected%20ACCESS%20token at com.xero.api.exception.XeroExceptionHandler.handleBadRequest(XeroExceptionHandler.java:120) at com.xero.api.client.AccountingApi.getAccounts(AccountingApi.java:2624) at com.xero.api.client.AccountingApiAccountsTest.testGetAccounts(AccountingApiAccountsTest.java:90) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access[111](ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

5
задан 21 February 2009 в 01:33
поделиться

8 ответов

Я предложил бы tr1:: unordered_map. Это реализовано как hashmap, таким образом, это имеет ожидаемую сложность O (1) для поисков и худшего случая O (n). Существует также внедрение BOOST, если Ваш компилятор не поддерживает tr1.

#include <string>
#include <iostream>
#include <tr1/unordered_map>

using namespace std;

int main()
{
    tr1::unordered_map<string, int> table;

    table["One"] = 1;
    table["Two"] = 2;

    cout << "find(\"One\") == " << boolalpha << (table.find("One") != table.end()) << endl; 
    cout << "find(\"Three\") == " << boolalpha << (table.find("Three") != table.end()) << endl; 

    return 0;
}
9
ответ дан 18 December 2019 в 05:44
поделиться

попробуйте это:

alt text
(источник: adrinael.net)

7
ответ дан 18 December 2019 в 05:44
поделиться

Станд. попытки:: карта.

5
ответ дан 18 December 2019 в 05:44
поделиться

Строки должны искаться доступные статически? Вы могли бы хотеть посмотреть на идеальную хеш-функцию

2
ответ дан 18 December 2019 в 05:44
поделиться

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

Позволить N будьте количеством строк, которые Вы ожидаете иметь в таблице и позволять C будьте средним количеством символов в любой данной строке, существующей в упомянутой таблице (или в строках, которые проверяются по таблице).

  1. В случае основанного на хеше подхода для каждого поиска Вы оплачиваете следующие издержки:

    • O(C) - вычисление хеша для строки Вы собираетесь искать
    • между O(1 x C) и O(N x C), где 1..N стоимость, на которую Вы ожидаете от пересечения блока на основе ключа хеша, здесь умноженного C перепроверять символы в каждой строке против ключа поиска
    • общее время: между O(2 x C) и O((N + 1) x C)
  2. В случае a std::map- основанный подход (который использует красно-черные деревья), для каждого поиска Вы оплачиваете следующие издержки:

    • общее время: между O(1 x C) и O(log(N) x C) - где O(log(N)) максимальная стоимость обхода дерева, и O(C) время когда std::mapуниверсальный less<> реализация берет для перепроверки ключа поиска во время обхода дерева

В случае больших значений для N и в отсутствие хеш-функции, которая гарантирует меньше, чем журнал (N) коллизии, или если Вы просто хотите избежать рискованных действий, Вы - более обеспеченное использование основанного на дереве (std::map) подход. Если N является маленьким, любой ценой, используйте основанный на хеше подход (все еще удостоверяясь, что хэш-коллизия является низкой.)

Прежде, чем принять любое решение, тем не менее, необходимо также проверить:

4
ответ дан 18 December 2019 в 05:44
поделиться

кажется, что массив работал бы просто великолепно, где индекс является индексом в массив. Чтобы проверить, существует ли это, просто удостоверьтесь, что индекс находится в границах измерения массива и что его запись не является ПУСТОЙ.

Править: при сортировке списка Вы могли бы всегда использовать двоичный поиск, который должен иметь быстрый поиск.

Править: Кроме того, если Вы хотите искать строку, можно всегда использовать a std::map<std::string, int> также. Это должно иметь некоторые достойные скорости поиска.

2
ответ дан 18 December 2019 в 05:44
поделиться

Самый легкий должен использовать станд.:: карта.

Это работает как это:

#include <map>
using namespace std;

...

   map<string, int> myContainer;
   myContainer["foo"] = 5; // map string "foo" to id 5
   // Now check if "foo" has been added to the container:
   if (myContainer.find("foo") != myContainer.end())
   {
       // Yes!
       cout << "The ID of foo is " << myContainer["foo"];
   }
   // Let's get "foo" out of it
   myContainer.erase("foo")
1
ответ дан 18 December 2019 в 05:44
поделиться

Google редкий хеш, возможно,

0
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: