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


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