powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстрый поиск поля в массиве в С
25 сообщений из 65, страница 1 из 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
25 сообщений из 65, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстрый поиск поля в массиве в С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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