Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Быстрый поиск поля в массиве в С / 25 сообщений из 65, страница 1 из 3
05.02.2019, 09:41
    #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
05.02.2019, 09:59
    #39769509
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск поля в массиве в С
jenya7,

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

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

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

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

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

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

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

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

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

принять и положить - разные задачи
...
Рейтинг: 0 / 0
05.02.2019, 13:11
    #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
05.02.2019, 13:31
    #39769642
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск поля в массиве в С
int hashIndex = hashCode(key); не возвращает уникальное значение на каждый ключ. а есть алгоритм позволяющий установить уникальное значение индекса?
...
Рейтинг: 0 / 0
05.02.2019, 15:08
    #39769694
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск поля в массиве в С
jenya7int hashIndex = hashCode(key); не возвращает уникальное значение на каждый ключ. а есть алгоритм позволяющий установить уникальное значение индекса?всегда. - нет
но есть алгоритмы устранения коллизий, но они к сожалению мало подточены на многопоточку

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

я же вам говорю, выдайте просто интерфейс и что он должен делать, будет проще подобрать - нету универсальных решений
table1.items приходят сразу все 12 элементов в одном списке - при получении я могу заполнить хэш таблицу.
table2[х] приходят по одному - при получении я могу вытянуть значение из хэш таблицы.
проблема в реализации хэш таблицы без лишних наворотов.
...
Рейтинг: 0 / 0
05.02.2019, 15:39
    #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
05.02.2019, 16:29
    #39769744
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск поля в массиве в С
Да о чем тут спор вообще. Автор - новичок. Пусть берет самую обычную стандартную (несинхронизированную)
хеш-табличку, оборачивает ее EnterCriticalSection(..) или линуксовый и тестит.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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