powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстрый поиск поля в массиве в С
65 сообщений из 65, показаны все 3 страниц
Быстрый поиск поля в массиве в С
    #39769499
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две структуры. Данные в структурах обновляются асинхронно.
Мне нужно по ключу(reference_number) найти и переписать поле(priority_level).
Делаю так.
Код: plaintext
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.
typedef struct 
{
    uint32_t reference_number; 
    uint32_t priority_level;
}ITEMS;

typedef struct 
{
    ITEMS items[12];
}TABLE1;

typedef struct 
{
    uint32_t reference_number; 
    uint32_t priority_level;
}TABLE2;

TABLE1 table1;
TABLE2 table2[512];

void FindUpdateField(void)
{
    int i = 0, j = 0,  found = 0;
    
    for ( i = 0; i < 12; i++)
    {
       found = 0; 
       while ( (found == 0) && (j < 512))
       {
           if (table2[j].reference_number == table1.items[i].reference_number)
           {
               table2[j].priority_level = table1.items[i].priority_level;
               found = 1;
           }
           else
               j++;
       }
    }
}


Но за время поиска в цикле (в одном таске) приходят новые данные и я отправляю пару пакетов со старыми данными (в другом таске).
Хотел сделать какой нибудь хэш тэйбл или дикшинэри но никак не соображу как связать поля.
Есть более быстрое решение?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769509
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

критическая секция для начала, куча проблем сразу отпадёт
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769512
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)jenya7,

критическая секция для начала, куча проблем сразу отпадёт

я не могу блокировать обновление данных. они приходят из разных источников и я должен принять их немедленно.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769515
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

тогда вам задачу надо более подробно описать, потому что сликом много может быть ньюансов в зависимости от поддерживаемых операций
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769521
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе нужен не поиск в массивах. А нормальная структура данных типа hashtable с поддержкой concurrency.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769522
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonТебе нужен не поиск в массивах. А нормальная структура данных типа hashtable с поддержкой concurrency.
в этом то и вопрос - как связать поля в hashtable.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769523
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

видел concurrency hashtable на си?
он на месяцы влезет

у него может задача вообще простенькая
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769529
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос в чем? Нагуглить?

Или ещё раз пересмотреть задачу. Мне кажется что постановка - гипертрофированая.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769593
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7kealon(Ruslan)jenya7,

критическая секция для начала, куча проблем сразу отпадёт

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

принять и положить - разные задачи
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769621
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я посмотрел реализацию hashtable

Код: plaintext
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.
#define SIZE 20

struct DataItem {
   int data;   
   int key;
};

struct DataItem* hashArray[SIZE]; 
struct DataItem* dummyItem;
struct DataItem* item;

int hashCode(int key) {
   return key % SIZE;
}

struct DataItem *search(int key) {
   //get the hash 
   int hashIndex = hashCode(key);  
	
   //move in array until an empty 
   while(hashArray[hashIndex] != NULL) {
	
      if(hashArray[hashIndex]->key == key)
         return hashArray[hashIndex]; 
			
      //go to next cell
      ++hashIndex;
		
      //wrap around the table
      hashIndex %= SIZE;
   }        
	
   return NULL;        
}

void insert(int key,int data) {

   struct DataItem *item = (struct DataItem*) malloc(sizeof(struct DataItem));
   item->data = data;  
   item->key = key;

   //get the hash 
   int hashIndex = hashCode(key);

   //move in array until an empty or deleted cell
   while(hashArray[hashIndex] != NULL && hashArray[hashIndex]->key != -1) {
      //go to next cell
      ++hashIndex;
		
      //wrap around the table
      hashIndex %= SIZE;
   }
	
   hashArray[hashIndex] = item;
}




тут используется динамическое выделение памяти а мне это не нужно – после получения списка содержащего 12 элементов (table1.items) я его сразу должен положить в таблицу.
А в другом месте вытащить значение table2[current_idx].priority_level = search(table2[current_idx]. reference_number)
Как мне переделать hashtable?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769642
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
int hashIndex = hashCode(key); не возвращает уникальное значение на каждый ключ. а есть алгоритм позволяющий установить уникальное значение индекса?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769694
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7int hashIndex = hashCode(key); не возвращает уникальное значение на каждый ключ. а есть алгоритм позволяющий установить уникальное значение индекса?всегда. - нет
но есть алгоритмы устранения коллизий, но они к сожалению мало подточены на многопоточку

я же вам говорю, выдайте просто интерфейс и что он должен делать, будет проще подобрать - нету универсальных решений
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769700
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)jenya7int hashIndex = hashCode(key); не возвращает уникальное значение на каждый ключ. а есть алгоритм позволяющий установить уникальное значение индекса?всегда. - нет
но есть алгоритмы устранения коллизий, но они к сожалению мало подточены на многопоточку

я же вам говорю, выдайте просто интерфейс и что он должен делать, будет проще подобрать - нету универсальных решений
table1.items приходят сразу все 12 элементов в одном списке - при получении я могу заполнить хэш таблицу.
table2[х] приходят по одному - при получении я могу вытянуть значение из хэш таблицы.
проблема в реализации хэш таблицы без лишних наворотов.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769709
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант хранить таблицы отсортированными по возрастанию reference_number, тогда сводится все к коду

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
i = 0; j = 0;
uint32_t  r1 = table2[j].reference_number, r2 = table1.items[i].reference_number;
if (r1 != dummy && r2 != dummy) {
while (true) {
           if (r1 > r2) {
             j++;
             if (j = 512 || (r1 = table2[j].reference_number) == dummy) break; 
           }
           elseif (r1 < r2) {
             {
               i ++;
               if (j = 12 || (r2 = table1.items[i].reference_numberr) == dummy) break; 
             }
           else
           {
               table2[j].priority_level = table1.items[i].priority_level;
               i ++;
           };
}
}



dummy - соответственно заглушки пустых ячеек.

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

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

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

В целом реализация будет зависеть от того какие задачи наиболее критичны.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769744
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да о чем тут спор вообще. Автор - новичок. Пусть берет самую обычную стандартную (несинхронизированную)
хеш-табличку, оборачивает ее EnterCriticalSection(..) или линуксовый и тестит.

Если ему ее не хватит - велком с оптимизиацией.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769750
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа о чем тут спор вообще. Автор - новичок. Пусть берет самую обычную стандартную (несинхронизированную)
хеш-табличку, оборачивает ее EnterCriticalSection(..) или линуксовый и тестит.

Если ему ее не хватит - велком с оптимизиацией.
+1
std::unordered_map и std::mutex для синхронизации доступа
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769756
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TmaytonДа о чем тут спор вообще. Автор - новичок. Пусть берет самую обычную стандартную (несинхронизированную)
хеш-табличку, оборачивает ее EnterCriticalSection(..) или линуксовый и тестит.

Если ему ее не хватит - велком с оптимизиацией.
+1
std::unordered_map и std::mutex для синхронизации доступа
у меня нет std::unordered_map. голый С.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769784
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
713 готовых реализаций хеш-таблиц на сях.

https://github.com/search?q=c hashtable

Не благодарите.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769786
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7у меня нет std::unordered_map. голый С.

А можете пояснить выбор средств? Вот нафига это дрочево кому-то нужно в 2019-м году? Ваша задача, например, на голанге решается тривиально, парой десятков строк кода. При этом сам голанг изучается за три дня. Если это студенческая работа, то, конечно, базара нет, а если работа практическая, то вот ну нафига?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769787
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ембедщик наверно. Но не знает алгоритмы.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769791
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лысый дядькаjenya7у меня нет std::unordered_map. голый С.

А можете пояснить выбор средств? Вот нафига это дрочево кому-то нужно в 2019-м году? Ваша задача, например, на голанге решается тривиально, парой десятков строк кода. При этом сам голанг изучается за три дня. Если это студенческая работа, то, конечно, базара нет, а если работа практическая, то вот ну нафига?
какой голанг я под микроконтролер пишу.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769799
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, ну наконец-то. Не прошло и дня.

Ты написал - данные в структурах обновляются асинхронно.

Вот давай рассказывай как реализованна асинхронность в твоём Х-контроллере?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769809
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonjenya7, ну наконец-то. Не прошло и дня.

Ты написал - данные в структурах обновляются асинхронно.

Вот давай рассказывай как реализованна асинхронность в твоём Х-контроллере?
там есть RTOS (VxWorks).
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769845
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

уже лучше, многозадачности значит нет

а отправлять то что должен?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769867
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan),

Многозадачности может и нет, а вот событие из прерывания может прилететь
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудесно.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769882
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111kealon(Ruslan),

Многозадачности может и нет, а вот событие из прерывания может прилететьвот никак не пугает, гораздо легче и понятнее
осталось понять что же ТС хочет вообще
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочет чтоб его научили работать с хеш-табличками. Вон... как он бедняга циклы крутит.
Не от хорошей жизни. Мдя.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769934
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Посмотрел кучу реализаций хэш таблиц. Ни одна не понравилась. Не т детерминизма. Каждый malloc должен иметь свой free. А тут я рискую остаться с кучей мусора и фрагментированной памятью.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769981
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

зачем вам выделять память по ходу? у вас вроде буфер стабильный выделен и его хватает

у меня складывается впечатления что я слепому рассказываю о цветах
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769986
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Посмотрел кучу реализаций хэш таблиц. Ни одна не понравилась. Не т детерминизма. Каждый malloc должен иметь свой free. А тут я рискую остаться с кучей мусора и фрагментированной памятью.
Женя, вместо того чтобы сразу бросаться в ковыряния имплементаций хэш таблиц, подумай какая идея стоит за ними. И используй эту идею для решения своей задачки. Тогда и маллоки не потребуются.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769997
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)jenya7,

зачем вам выделять память по ходу? у вас вроде буфер стабильный выделен и его хватает

у меня складывается впечатления что я слепому рассказываю о цветах
так работает хэш таблица. динамически выделает память под новый элемент.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39769999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Посмотрел кучу реализаций хэш таблиц. Ни одна не понравилась. Не т детерминизма. Каждый malloc должен иметь свой free. А тут я рискую остаться с кучей мусора и фрагментированной памятью.
Давай определимся с целями. Какой тебе нужен детерминизм?
В первом варианте исходного кода у тебя был линейный поиск в массиве. Никакого детерминизма
вообще не было по времени отклика. И вообще - это была фейеричная фейерия.

По malloc, есть хеш таблицы которые работают внутри одного массива. Я такие еще изучал на 1-м курсе универа.
Но у них есть компромисс между памятью и количеством промахов поиска.

Вобщем.. определись что тебе надо. Иначе у сообщества сложится впечатление что ты - капризная девица.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770000
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OoCcjenya7Посмотрел кучу реализаций хэш таблиц. Ни одна не понравилась. Не т детерминизма. Каждый malloc должен иметь свой free. А тут я рискую остаться с кучей мусора и фрагментированной памятью.
Женя, вместо того чтобы сразу бросаться в ковыряния имплементаций хэш таблиц, подумай какая идея стоит за ними. И используй эту идею для решения своей задачки. Тогда и маллоки не потребуются.
идея хэш таблицы прекрасна - немедленно получить индекс в таблице по ключу. это даст быстрый доступ к элементу, без перебора в цикле. только индекс не уникален. и вот тут начинаются танцы с бубнами.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770010
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonjenya7Посмотрел кучу реализаций хэш таблиц. Ни одна не понравилась. Не т детерминизма. Каждый malloc должен иметь свой free. А тут я рискую остаться с кучей мусора и фрагментированной памятью.
Давай определимся с целями. Какой тебе нужен детерминизм?
В первом варианте исходного кода у тебя был линейный поиск в массиве. Никакого детерминизма
вообще не было по времени отклика. И вообще - это была фейеричная фейерия.

По malloc, есть хеш таблицы которые работают внутри одного массива. Я такие еще изучал на 1-м курсе универа.
Но у них есть компромисс между памятью и количеством промахов поиска.

Вобщем.. определись что тебе надо. Иначе у сообщества сложится впечатление что ты - капризная девица.
не нашел хэш таблицы без malloc. это как раз то что нужно. а почему должен быть промах? мы ведь идем прямо по индексу. (idx=hash(key)). то есть возникает ситуация когда несколько элементов дадут тот же индекс. и сколько выделить памяти в статическом варианте? я не могу предсказать сколько ключей совпадут.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770015
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7OoCcпропущено...

Женя, вместо того чтобы сразу бросаться в ковыряния имплементаций хэш таблиц, подумай какая идея стоит за ними. И используй эту идею для решения своей задачки. Тогда и маллоки не потребуются.
идея хэш таблицы прекрасна - немедленно получить индекс в таблице по ключу. это даст быстрый доступ к элементу, без перебора в цикле. только индекс не уникален. и вот тут начинаются танцы с бубнами.
ответ неверный. немедленно получается индекс бакета.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770065
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7и вот тут начинаются танцы с бубнами
А какие танцы то?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770067
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим я получил table1.items - и все 12 элементов поместил в хэш таблицу

//insert (key, value)

insert(table1.items[0].reference_number, table1.items[0].priority_level); //malloc

.................................................................................................

insert( table1.items[11].reference_number, table1.items[11].priority_level); //malloc


приходят элементы

//value = get(key)

table2[idx].priority_level = get(table2[idx].reference_number);

delete(table2[idx].reference_number) //free


но элемент может быть удален из table2 за ненадобностью. и он никогда не обратиться к хэш таблице и не освободит память выделенную под него.


Весь алгоритм такой.

1. Пришел список table1.items

2. По принятию списка иду в массиве table2 - ищу reference_number в списке table1.items и если нашел обновляю priority_level.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770074
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7kealon(Ruslan)jenya7,

зачем вам выделять память по ходу? у вас вроде буфер стабильный выделен и его хватает

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

Код: pascal
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.
function TDictionary<TKey,TValue>.GetBucketIndex(const Key: TKey; HashCode: Integer): Integer;
var
  start, hc: Integer;
begin
  if Length(FItems) = 0 then
    Exit(not High(Integer));

  start := HashCode and (Length(FItems) - 1);
  Result := start;
  while True do
  begin
    hc := FItems[Result].HashCode;

    // Not found: return complement of insertion point.
    if hc = EMPTY_HASH then
      Exit(not Result);

    // Found: return location.
    if (hc = HashCode) and FComparer.Equals(FItems[Result].Key, Key) then
      Exit(Result);

    Inc(Result);
    if Result >= Length(FItems) then
      Result := 0;
  end;
end;
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770081
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,
jenya7не нашел хэш таблицы без malloc.
для комплекта, удаление оттуда же

Код: pascal
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.
function TDictionary<TKey,TValue>.DoRemove(const Key: TKey; HashCode: Integer;
  Notification: TCollectionNotification): TValue;
var
  gap, index, hc, bucket: Integer;
  LKey: TKey;
begin
  index := GetBucketIndex(Key, HashCode);
  if index < 0 then
    Exit(Default(TValue));

  // Removing item from linear probe hash table is moderately
  // tricky. We need to fill in gaps, which will involve moving items
  // which may not even hash to the same location.
  // Knuth covers it well enough in Vol III. 6.4.; but beware, Algorithm R
  // (2nd ed) has a bug: step R4 should go to step R1, not R2 (already errata'd).
  // My version does linear probing forward, not backward, however.

  // gap refers to the hole that needs filling-in by shifting items down.
  // index searches for items that have been probed out of their slot,
  // but being careful not to move items if their bucket is between
  // our gap and our index (so that they'd be moved before their bucket).
  // We move the item at index into the gap, whereupon the new gap is
  // at the index. If the index hits a hole, then we're done.

  // If our load factor was exactly 1, we'll need to hit this hole
  // in order to terminate. Shouldn't normally be necessary, though.
  FItems[index].HashCode := EMPTY_HASH;
  Result := FItems[index].Value;
  LKey := FItems[index].Key;

  gap := index;
  while True do
  begin
    Inc(index);
    if index = Length(FItems) then
      index := 0;

    hc := FItems[index].HashCode;
    if hc = EMPTY_HASH then
      Break;

    bucket := hc and (Length(FItems) - 1);
    if not InCircularRange(gap, bucket, index) then
    begin
      FItems[gap] := FItems[index];
      gap := index;
      // The gap moved, but we still need to find it to terminate.
      FItems[gap].HashCode := EMPTY_HASH;
    end;
  end;

  FItems[gap].HashCode := EMPTY_HASH;
  FItems[gap].Key := Default(TKey);
  FItems[gap].Value := Default(TValue);
  Dec(FCount);

  KeyNotify(LKey, Notification);
  ValueNotify(Result, Notification);
end;
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770083
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7но элемент может быть удален из table2 за ненадобностью

А может быть лучше мы узнаем ТЗ в его первоначальном варианте? Это же обычная практика - нагородить всякой херни, а потом с ней мучиться. Может быть там и нафиг не нужны никакие две таблицы.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770088
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядька,

да мы у него уже вторую страницу это спрашиваем, не понимает :-)
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

У тебя по коду выделено 512штук * 4байта * 2штуки = 4096 байт и еще 12 * 4 * 2 = 48 байт
статично.

сколько тебе доступно памяти для решения этой задачи? Мы должны ориентироваться в цифрах.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770105
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonjenya7,

У тебя по коду выделено 512штук * 4байта * 2штуки = 4096 байт и еще 12 * 4 * 2 = 48 байт
статично.

сколько тебе доступно памяти для решения этой задачи? Мы должны ориентироваться в цифрах.
не понял вопроса? проблема в скорости поиска элемента. table1 и table2 это статическая память в РАМ.
я получил данные
table1.items[0].reference_number = 100
table1.items[0].priority_level = 0
------------------------------------------
table1.items[11].reference_number = 111
table1.items[11].priority_level = 11

в этот момент я перебираю все элемены в table2 и ищу совпадение table2[i].reference_number == table1.items[j].reference_number
нашел? table2[i].priority_level == table1.items[j].priority_level
вся проблема в быстроте поиска. это единственная проблема.
в случае с хэш таблицей нужно учитывать что элементы в table2 могут быть удалены и выделенная память в хэш таблице не освободиться.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770115
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, а 100% критично, что нужны самые-самые новые в момент отправки? Я сталкивался с системами датчиков, так там порешили проводить опрос датчиков насильно как можно чаще (~1/20 с). Но идея на клиенте была простая - содержать собственный буфер.
Состояний общее число было сравнимое кол-во, неск. десятков, датчиков - вусмерть (напр. десятки тыс.) Правда первичная обработка была централизованной, но на случай поломки центра, были децентрализованные подбазы и слали напрямую.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770119
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
exp98jenya7, а 100% критично, что нужны самые-самые новые в момент отправки? Я сталкивался с системами датчиков, так там порешили проводить опрос датчиков насильно как можно чаще (~1/20 с). Но идея на клиенте была простая - содержать собственный буфер.
Состояний общее число было сравнимое кол-во, неск. десятков, датчиков - вусмерть (напр. десятки тыс.) Правда первичная обработка была централизованной, но на случай поломки центра, были децентрализованные подбазы и слали напрямую.
если бы не было критично не возник бы вопрос. как по мне не 100% но это не я решаю.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770121
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7...после получения списка содержащего 12 элементов (table1.items) я его сразу должен положить в таблицу.
А в другом месте вытащить значение ... Насколько сразу ? Может никому не говорить, что была задержка?
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770123
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, есть простоеобъяснение для хотелок:
Между получением и отправакой неминоемо проходит некоторое время. За этот промежуток отправака может успеть устареть.
Конкретика требует цифр (для и от хотящих), т.е. некоторые показатели производительности. Обоснованные! ИМХО
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770128
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, тоже важно всё или не всё пришедшее отправлять. Если не, т.е. очередь, стек, каждый 7-й ... т.е. по какому принципу.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770193
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7не понял вопроса? проблема в скорости поиска элемента. table1 и table2 это статическая память в РАМ.
я получил данные
table1.items[0].reference_number = 100
table1.items[0].priority_level = 0
------------------------------------------
table1.items[11].reference_number = 111
table1.items[11].priority_level = 11

в этот момент я перебираю все элемены в table2 и ищу совпадение table2[i].reference_number == table1.items[j].reference_number
нашел? table2[i].priority_level == table1.items[j].priority_level
вся проблема в быстроте поиска. это единственная проблема.
в случае с хэш таблицей нужно учитывать что элементы в table2 могут быть удалены и выделенная память в хэш таблице не освободиться.
Блинн. Почему с тобой так сложно? Почему ты решил что это есть проблема? Я не просто так спросил
про доступную память. Потому что СУЩЕСТВУЮТ хеш таблички которые работают не ре-аллоцируя
память. Но для этого им нужно дать чуть больше памяти (1.5-2 раза) чем твои элементы. ПОЭТОМУ
я нудным голосом спрашиваю тебя еще раз - Сколько памяти можно выделить в твоём микро-контроллере
или ХЗ в чем-то еще!

Женя. Дорогой. Отвечай на вопросы экспертов. Если ты не отвечаешь - то можно сделать вывод
что помощь тебе не нужна. И ты просто пришел сюда от скуки.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770214
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonjenya7не понял вопроса? проблема в скорости поиска элемента. table1 и table2 это статическая память в РАМ.
я получил данные
table1.items[0].reference_number = 100
table1.items[0].priority_level = 0
------------------------------------------
table1.items[11].reference_number = 111
table1.items[11].priority_level = 11

в этот момент я перебираю все элемены в table2 и ищу совпадение table2[i].reference_number == table1.items[j].reference_number
нашел? table2[i].priority_level == table1.items[j].priority_level
вся проблема в быстроте поиска. это единственная проблема.
в случае с хэш таблицей нужно учитывать что элементы в table2 могут быть удалены и выделенная память в хэш таблице не освободиться.
Блинн. Почему с тобой так сложно? Почему ты решил что это есть проблема? Я не просто так спросил
про доступную память. Потому что СУЩЕСТВУЮТ хеш таблички которые работают не ре-аллоцируя
память. Но для этого им нужно дать чуть больше памяти (1.5-2 раза) чем твои элементы. ПОЭТОМУ
я нудным голосом спрашиваю тебя еще раз - Сколько памяти можно выделить в твоём микро-контроллере
или ХЗ в чем-то еще!

Женя. Дорогой. Отвечай на вопросы экспертов. Если ты не отвечаешь - то можно сделать вывод
что помощь тебе не нужна. И ты просто пришел сюда от скуки.
В принципе занести в хэш таблицу нам нужно 12 элементов. Даже если нужно памяти в два раза больше - 24 элемента, конечно там есть. Это не слабый микроконтролер у него 128 Мега РАМ.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770235
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извиняюсь. ошибся. это если бы было определенное количество ключей (reference_number). если придет элемент с другим ключем то нужно добавлять элемент в хэш таблицу.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7В принципе занести в хэш таблицу нам нужно 12 элементов. Даже если нужно памяти в два раза больше - 24 элемента, конечно там есть. Это не слабый микроконтролер у него 128 Мега РАМ.
В английской википедии по HashTable описан метод открытой адресации.

https://en.wikipedia.org/wiki/Hash_table#Open_addressing

Можешь его использовать. Экспериментально подбери размер чтоб для твоих данных не было ни одной коллизии.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770241
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonjenya7В принципе занести в хэш таблицу нам нужно 12 элементов. Даже если нужно памяти в два раза больше - 24 элемента, конечно там есть. Это не слабый микроконтролер у него 128 Мега РАМ.
В английской википедии по HashTable описан метод открытой адресации.

https://en.wikipedia.org/wiki/Hash_table#Open_addressing

Можешь его использовать. Экспериментально подбери размер чтоб для твоих данных не было ни одной коллизии.
спасибо. попробую.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770309
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вобщем сделал такой ход конем

Код: plaintext
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.
typedef struct 
{
    int key;
    int value;
    int used;
} HT_NODE;

HT_NODE nodes[NODES_COUNT][NODE_SIZE] = { 0 };

int HASHTBL_GetIndex(int key)
{
    return (key % NODES_COUNT);
}


int HASHTBL_Push(int key, int value) 
{
    //get a node number
    int node_num = HASHTBL_GetIndex(key);
    int idx = 0, unused_idx, first = 0;
    
    //scan all node elements
    while (idx < NODE_SIZE)
    {
        //used elements - if the same key - rewrite
        if (nodes[node_num][idx].used)
        {
            if (nodes[node_num][idx].key == key)
            {
                nodes[node_num][idx].value = value;
                return UPDATED;
            }
        }
        else
        {
           if (!first)
           {
               first =  1;
               //remember the first unused element
               unused_idx = idx;  
           }
        }
        idx++;
    }  
    
    //the same key not found - insert it in the first empty slot
    nodes[node_num][unused_idx].key = key;
    nodes[node_num][unused_idx].value = value;
    nodes[node_num][unused_idx].used = 1;
    
    return NEW;
}


int HASHTBL_Pop(int key) 
{
    int node_num = HASHTBL_GetIndex(key);
    int idx = 0;
    
    //scan all node elements
    while (idx < NODE_SIZE)
    {
        if (nodes[node_num][idx].used)
        {
            if ( nodes[node_num][idx].key == key )
            {
                nodes[node_num][idx].used = 0;
                return nodes[node_num][idx].value;
            }
        }
        
        idx++;
    }
    
    return NOT_FOUND;
}




нужно только оптимально настроить количество узлов и их глубину.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770315
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри еще как хешируют целые числа
https://en.wikipedia.org/wiki/Universal_hashing#Hashing_integers
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770318
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я не врубаюсь в проблему, но мне кажется, что проблема "...обновляются асинхронно.....за время поиска....." решается корректным многозадачным программированием (блокировками, copy-on-write и так далее) и никакой алгоритм поиска, хоть в цикле, хоть hash'ем, хоть через ж..., хоть через гланды - никак ситуацию изменить не может

IMHO & AFAIK
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770321
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7,

хеш таблица на 12 элементов не имеет смысла, дольше будете вычислять хеши, даже последовательное чтение 12 элементов будет быстрее. Если уж и делать хеш то для таблицы 512 элементов. Тогда нужно будет вычислить всего 12 хешей.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770323
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск в массиве из двух элементов обычно идет быстрее чем в хеш табличке из двух этих-же
элементов. Это я не ради троллинга сказал. А просто такова есть природа вещей. Иногда
мы используем хеш-таблички просто потому что верим в них.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770377
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...обычно идет быстрее.....
Какая разница: быстрее/медленнее ?

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


Где-то в Инете
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Core i7 Xeon 5500 Series Data Source Latency (approximate)               [Pg. 22]

local  L1 CACHE hit,                              ~4 cycles (   2.1 -  1.2 ns )
local  L2 CACHE hit,                             ~10 cycles (   5.3 -  3.0 ns )
local  L3 CACHE hit, line unshared               ~40 cycles (  21.4 - 12.0 ns )
local  L3 CACHE hit, shared line in another core ~65 cycles (  34.8 - 19.5 ns )
local  L3 CACHE hit, modified in another core    ~75 cycles (  40.2 - 22.5 ns )

remote L3 CACHE (Ref: Fig.1 [Pg. 5])        ~100-300 cycles ( 160.7 - 30.0 ns )

local  DRAM                                                   ~60 ns
remote DRAM                                                  ~100 ns
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770382
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если люди работают с сетевым протоколом то ожидание готовности следующего
сетевого пакета будет настолько недетерминированным и говорить о наносекундах
будет настолько странно как если-бы мы с вами говорили о личной гигиене во времена
короля Людовика 14. Зачем говорит о том чего нет. И какой смысл ускорять хендлинг
данных в наносекунды если лаг сетей меряется милисекундами. Это цифры не того порядка.

Хотя может у автора там другая шина. Не эзернет...

Был лет 5 назад один чел с ником Студентик/Базист. Если помните.
Он строил ин-мемори ДБМС с наносекундным откликом. А адаптеры к ней писал на дотнете.
Вобщем... нагромождение нелепиц. Хотя с ним было нескучно.
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770386
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

да ТС пока даже не удосужился ответить "кто ложит данные", "кто забирает данные" без учёта этого решать то, что он навыдумывал вообще бессмысленно
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770390
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21801729 )))
21802617 "вся проблема в быстроте поиска. это единственная проблема." ( C ) )))))))))

mayton...о личной гигиене во времена короля Людовика 14....
"дорогая, я возврашаюсь из Египта, не мойся" ( C ) Наполион - Жозефине )))
не дословно, с чужих слов, ссылку на архивные материалы привести не могу
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770395
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Французы это еще те пакостники. Не в обиду им будь сказано. По поводу "разных источников".
Принят и обработать - не одно и то-же. Никто не запрещает автору их просто складывать в кольцевой буфер
и обрабатывать по мере возможности. На прерываниях там... или на континуэйшенах или хер ево знает
как этот АРМ работает. Не знаю. Но я вобщем щас нарушаю своё собственное правило в топиках...
Начинаю додумывать за автора его задачу.

А он - скуп на слова. Мдя... Может дипломную работу делает. Эдакий стесняшка..
...
Рейтинг: 0 / 0
Быстрый поиск поля в массиве в С
    #39770413
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Offtopic "про Людовика XIV":


где-то-в-Инете...
К минимальной обязательной ежедневной гигиене в 16-18 веках относилось умывание рук, лица и ног. Водой. И чем холоднее, тем лучше. Этому учили с детства. За обеденным столом у знати стояли плошки с душистой водой и полотенца – чтобы перед едой сполоснуть руки. Но, как во все времена, люди были более чистоплотные и менее чистоплотные.

Рот споласкивали водой, а зубы чистили деревянными палочками. В Европе зубная щетка появилась в 50-х годах XVI века. Уже в 1728 г. знаменитый французский врач Фошар в руководстве по зубоврачеванию указывал о применении зубной щетки из щетины. Для усиления очищающего действия зубной щетки издавна применяли различные порошки: пепел, поваренную соль. Конечно, зубы у многих были плохие.
...
Людовик XIV
...
Герцог Сен-Симон описывает, что тело короля по утрам растирали лосьоном из роз и затем насухо полотенцем и меняли рубашку. Один из слуг умывал королю руки смесью воды и вина. Людвиг XIV полностью менял гардероб 3-4 раза в день – после охоты, после прогулки, после бала. И каждый раз ему подавали свежее белье и растирали его с головы ло пят спиртовым лосьоном из роз или лаванды. Таким образом, он был одним из самых чистых людей своей эпохи.

И ванны Людовик XIV принимал. Но он в них .....не мылся, а принимал их с лечебными целями, с целью расслабиться, а также для интимных встреч с фаворитками...Его подданные старались копировать его во всем. При Людовике XIV в Версале было около 100 мобильных ванн. Король не разрешал устанавливать в Версале стационарные ванны. Исключением был он сам. Сам Людовик XIV был единственным в Версале, кто имел не мобильные, а стационарные «купальные апартаменты - «appartements de bains», состоявшие из трех помещений, с теплой водой.
....

Купальные аппартаменты Людовика XIV в Версале (восьмиугольная ванна изображена красным цветом).

Вот что осталось от ванных аппартаментов Людовика XIV: восьмиугольная ванна из лангедокского мрамора. Эта ванна «короля-солнца» прошла через многие руки, одно время была в собственности Мадам де Помпадур, затем Наполеона. А теперь стоит в оранжерее Версаля. Раньше стены ванны украшали фигуры дельфинов и русалок. Но новому королю Людовику XV помещения понадобились для своей дочери – Версаль постоянно перестраивался. И „appartements de bains" были разрушены. Сейчас эта ванна стоит в Оранжерее Версаля.


Франция, XVII век, Неизвестный художник. Женщина принимает ванну с чашкой шоколада


Bidet / биде изобрели и впервые стали применять во Франции в 17м веке. В переводе это слово обозначает «маленькая лошадка»




Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстрый поиск поля в массиве в С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]