Форум программистов, компьютерный форум CyberForum.ru

Организовать ассоциированную карту строк, с возможностью быстрого поиска по хеш-таблице - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Подсчет сумм элементов массива http://www.cyberforum.ru/cpp-beginners/thread424052.html
Здравствуйте. Помогите, пожалуйста, с решением такой задачи. Есть массив чисел (одномерный). Необходимо найти все суммы чисел из этого массива такие, чтобы они были >= заданного числа k, с минимальным числом слагаемых. То есть если такая сумма найдена при числе слагаемых равному 1 (т.е. существует число в массиве, больше либо равное k), необходимо запомнить число слагаемых (n:=1) и все номера...
C++ Динамический двумерный массив Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и зна-чение 1 − в противном случае. http://www.cyberforum.ru/cpp-beginners/thread424033.html
Массив C++
Народ, кто может помогите. Мне уже чуть-чуть помогли ребята. Надо составить программу, которая будет считать сумму ЧЕТНЫХ ЭЛЕМЕНТОВ МАССИВА. Не тех, которые стоят на четных местах, а именно четные! Буду благодарен=) Добавлено через 11 минут #include <iostream> #include <conio.h> using namespace std; int main () { int i, n, sum;
кнопки в Visual Studio (2010) C++
как сделать чтобы при нажатии на кнопку она окрашивалась в другой цвет?
C++ Хочу записать текст в файл host http://www.cyberforum.ru/cpp-beginners/thread424004.html
Вот хочу сделать программу которая будет записать сайты(которые пользователь пожелает) в файл host, что бы на них не переходить. вот написал код но там много ошибок не понятных, хотя вроде бы делал все правильно : #include <iostream> #include <fstream> #include <string> using namespace std; int main() { ofstream f;
C++ Написать программу японский гороскоп Здравствуйте. Мне нужно написать программу японский гороскоп. Но самое интересное в том, что каждый год должен выделяться своим цветом. Пожалуйста, выручите. Заранее большое спасибо :). Крыса (сырый) 1924,1936, 1948, 1960, 1972, 1984, 1996, 2008 Бык (красный цвет) 1925, 1937, 1949, 1961, 1973, 1985, 1997, 2009 Тигр (жёлтый) 1926, 1938, 1950, 1962, 1974, 1986, 1998, 2010 подробнее

Показать сообщение отдельно
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
08.01.2012, 14:44     Организовать ассоциированную карту строк, с возможностью быстрого поиска по хеш-таблице
задание таково
организовать асоциированную карту строк, с возможностью быстрого поиска по хеш-таблице
хеш функция - md4

суть проблем в чем.
хеш-таблица в STL - hash_map. значит ключом должен быть - хеш,а значением - строка. но! я считал что добавлять в таблицу можно разные значения. то есть если уже строка содержится в таблице её добавить нельзя. но у меня почему-то добавляется.
C++
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
85
86
87
88
89
90
91
92
93
94
95
#include <hash_map>
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
#include <WinCrypt.h>
#include <string>
#pragma comment(lib,"crypt32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::hash_map<HCRYPTHASH*,std::string*> table;
    while(1)
    {
        ::system("cls");
        std::cout<<"Add---1\n";
        std::cout<<"View--2\n";
        std::cout<<"Find--3\n";
        int x;
        std::cin>>x;
        switch(x)
        {
        case 1:
            {
                ::system("cls");
                        std::string *tohash=new std::string();
                            std::cout<<"String to hash\n";
                            std::cin>>*tohash;
                        HCRYPTHASH *hash=new HCRYPTHASH();
                        HCRYPTPROV *prov=new HCRYPTPROV();
                        BYTE *buf1=(BYTE*)tohash->c_str();
                            DWORD buf1len=strlen((char*)buf1)+1;
                            ::CryptAcquireContext(prov,NULL,NULL,PROV_RSA_AES,0);
                            ::CryptCreateHash(*prov,CALG_MD4,0,0,hash);
                            ::CryptHashData(*hash,buf1,buf1len,0);
                        std::pair<HCRYPTHASH*,std::string*> pair;
                        pair.first=hash;
                        pair.second=tohash;
                        table.insert(pair);
                ::system("pause");
                break;
            }
        case 2:
            {
                ::system("cls");
                std::cout<<"Contains\n";
                            for each(std::pair<HCRYPTHASH*,std::string*> x in table)
                            {
                             BYTE hash[16];
                             DWORD length=16;
                             ::CryptGetHashParam(*x.first,HP_HASHVAL,hash,&length,0);
                             for(int i=0;i<length;i++)
                              std::cout<<hash[i];
                             std::cout<<" "<<*x.second;
                             std::cout<<std::endl;
                            }
                ::system("pause");
                break;
            }
        case 3:
            {
                ::system("cls");
                std::string *tocompare=new std::string();
                            std::cout<<"String to compare\n";
                            std::cin>>*tocompare;
                                HCRYPTPROV *provider=new HCRYPTPROV();
                            HCRYPTHASH *hashA=new HCRYPTHASH();
                            BYTE *buf11=(BYTE*)tocompare->c_str();
                            DWORD buf11len=strlen((char*)buf11)+1;
                            ::CryptAcquireContext(provider,NULL,NULL,PROV_RSA_AES,0);
                            ::CryptCreateHash(*provider,CALG_MD4,0,0,hashA);
                            ::CryptHashData(*hashA,buf11,buf11len,0);
                BYTE guf[16];
                            DWORD rip=16;
                            ::CryptGetHashParam(*hashA,HP_HASHVAL,guf,&rip,0);
                std::cout<<"Hash to compare\n";
                            for(int i=0;i<rip;i++)
                             std::cout<<guf[i];
                            std::cout<<" "<<*tocompare<<"\nResult of find\n";
                for each(std::pair<HCRYPTHASH*,std::string*> x in table)
                            {
                             BYTE hash[16];
                             DWORD length=16;
                             ::CryptGetHashParam(*x.first,HP_HASHVAL,hash,&length,0);
                             if (memcmp(guf,hash,16)==0)
                             {
                                 printf("Found\n");
                             break;
                             }
                            }
                ::system("pause");
                            break;
            }
        }
    }
}
еще непонятен быстрый поиск. я просто обхожу таблицу перебором. а как правильно надо?

Добавлено через 19 часов 38 минут
может быть проблема что ключом является указатель?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru