ESP32. Библиотека сжатия массива данных в памяти

СУБД, индексы?
Почитайте как хранятся в ней данные.

Ну, база данных это, конечно, круто и быстро, но мне хочется как-то попроще, в пределах одного экрана Си-кода :). На самом деле мне нужна идея, как это в принципе можно сделать.

Дык никто и не говорит повторить БД.
Хранить в памяти сами объекты и рядом индекс, по сути порядковый номер по увеличению значения 32х битного значения.
И вся задача по сути сводится к поиску значения в упорядоченном списке.
ЗЫ. Изучаются все эти методы в технических вузах. Или в интернете все есть.

Прежде всего следует определить понятие “сложности”.
Например, простой перебор записывается в одну строчку, но имеет вычислительную сложность O(N).
Вот что имеется в виду под “сложностью”, длина записи алгоритма или время его работы?

Ты троллишь? Это называется поиск индекса в массиве или поиск по ключу и так далее. Упорядочишь сперва за O(N*logN) шагов и ищи потом за O(logN) или сразу ищи за O(N).

Я думаю, что он “сложность” определяет в количестве “страничек” кода на С :wink: :wink: :wink:

Если у тебя всего лишь 2000 значений, их можно отсортировать, присвоить индекс и посчитать кол-во вхождений каждого числа. Индекс влезет в 2 байта, то есть каждому 32х разрядному числу поставить в соответствие 16 разрядное. При условии наличия на принимающей стороне точно такого же массива, можно передавать только индексы, сыканомив трафик в 2 раза. А если индексы передавать не 16 бит, а 11 (2000 в этот диапанос укладывается), то передавать придётся еще меньше

а если я 12 символов(12 байт) из utf 8 запишу 3 байтами в ASCII это будет считаться что я уменьшил число ?))) или это уже есть, и это обычные операции ? кажется научился 12 сокращать до 3, но это не точно)))

const int numRows = 8; // Количество строк
const int rowLength = 8; // Длина каждой строки
char receivedData[64]; // Массив для хранения принятых данных 64 максимум
char lines[numRows][rowLength + 1]; // Массив строк (плюс 1 для нуль-терминатора)

void setup() {
Serial.begin(9600); // Инициализация последовательного порта
Serial.println("Введите 64 символа:");
}

void loop() {
if (Serial.available() >= 63) { // Проверяем, что доступно 64 символа
Serial.readBytes(receivedData, 64);   // Читаем 64 символа из последовательного порта
for (int i = 0; i < numRows; i++) {// Разбиваем на строки по 8 символов
// Копируем 8 символов в строку и добавляем нуль-терминатор
memcpy(lines[i], &receivedData[i * rowLength], rowLength);
lines[i][rowLength] = '\0'; }// Добавляем нуль-терминатор
for (int i = 0; i < numRows; i++) {Serial.println(lines[i]); }// Выводим все строки
}
}

если можно попутно подскажите пж что поправить тут ?
дело в том что работает только так if (Serial.available() >= 63) а если будет 64 то не сработает, а если 63 то сработает, но при вводе второй раз 8 символ пропадает…

профессор, разбирать твой код это отдельно оплачиваемая работа должна быть, с аккордно-авансовой системой оплаты.

если вы мне то я … студент, я знаю только то что нечего не знаю, к тому же комментарии оставил))) вникать не надо, если что то таам элементарное упускаю то подскажите пж…

я не понимаю ничего из того что ты пишешь, я тупой.

2 лайка
#include <Arduino.h>

const int SIZE = 2000;  // Размер массива
uint32_t numbers[SIZE]; // Массив уникальных 32-битовых чисел
int indexMap[SIZE];     // Массив для хранения индексов

void setup() {
Serial.begin(9600);
// Заполнение массива уникальными числами
for (int i = 0; i < SIZE; i++) { numbers[i] = i * 1000; indexMap[i] = i; }// Сохраняем индексы
// Пример использования функции f()
uint32_t valueToFind = 1000; // Число, индекс которого мы хотим найти
int index = f(valueToFind);
if (index != -1) {
Serial.print("Индекс числа "); Serial.print(valueToFind);
Serial.print(" равен: "); Serial.println(index);
} else { Serial.print("Число "); Serial.print(valueToFind); Serial.println(" не найдено.");}
}

void loop() { }
// Функция для поиска индекса числа в массиве
int f(uint32_t value) {
for (int i = 0; i < SIZE; i++) {
if (numbers[i] == value) {
return indexMap[i];} // Возвращаем индекс
} return -1; } // Если число не найдено, возвращаем -1

Глобальные переменные используют 12260 байт (598%) динамической памяти, оставляя -10212 байт для локальных переменных. Максимум: 2048 байт.
пойдет или не то ?)))

Cтудент, CTRL+T освой хотя бы для начала.

1 лайк

вот это я понял, ништяк у тебя ресурсов хватает.

1 лайк

Ты это понял только потому, что писал это не BABOS, а компилятор.

Время работы, конечно.

Ну у тебя просто поиск. Это и так понятно.

Функция нужна. А у тебя - процедура.

Это в Паскале они различаются, а в С/С++ это одно и то же.

Возвернем, однако, тему топика в нужном направлении.

Библиотека для ESP32, для сжатия данных:

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

Ну, тогда пусть будет jpg.

@sav13, ищи файл miniz.c версии, как на скриншоте.

Пример использования (у меня у одного синтаксис не подсвечивается? Или это вообще фишка всей экосистемы ардуино? что ИДЕ, что Форум - глюк на глюке и багами погоняет.):

// example1.c - Demonstrates miniz.c's compress() and uncompress() functions (same as zlib's).
// Public domain, May 15 2011, Rich Geldreich, richgel99@gmail.com. See "unlicense" statement at the end of tinfl.c.
#include "miniz.c"

typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint;

// The string to compress.
static const char *s_pStr = "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
  "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
  "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
  "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
  "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
  "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson." \
  "Good morning Dr. Chandra. This is Hal. I am ready for my first lesson.";

int main(int argc, char *argv[])
{
  uint step = 0;
  int cmp_status;
  uLong src_len = (uLong)strlen(s_pStr);
  uLong cmp_len = compressBound(src_len);
  uLong uncomp_len = src_len;
  uint8 *pCmp, *pUncomp;
  uint total_succeeded = 0;
  (void)argc, (void)argv;

  printf("miniz.c version: %s\n", MZ_VERSION);

  do
  {
    // Allocate buffers to hold compressed and uncompressed data.
    pCmp = (mz_uint8 *)malloc((size_t)cmp_len);
    pUncomp = (mz_uint8 *)malloc((size_t)src_len);
    if ((!pCmp) || (!pUncomp))
    {
      printf("Out of memory!\n");
      return EXIT_FAILURE;
    }

    // Compress the string.
    cmp_status = compress(pCmp, &cmp_len, (const unsigned char *)s_pStr, src_len);
    if (cmp_status != Z_OK)
    {
      printf("compress() failed!\n");
      free(pCmp);
      free(pUncomp);
      return EXIT_FAILURE;
    }

    printf("Compressed from %u to %u bytes\n", (mz_uint32)src_len, (mz_uint32)cmp_len);

    if (step)
    {
      // Purposely corrupt the compressed data if fuzzy testing (this is a very crude fuzzy test).
      uint n = 1 + (rand() % 3);
      while (n--)
      {
        uint i = rand() % cmp_len;
        pCmp[i] ^= (rand() & 0xFF);
      }
    }

    // Decompress.
    cmp_status = uncompress(pUncomp, &uncomp_len, pCmp, cmp_len);
    total_succeeded += (cmp_status == Z_OK);

    if (step)
    {
      printf("Simple fuzzy test: step %u total_succeeded: %u\n", step, total_succeeded);
    }
    else
    {
      if (cmp_status != Z_OK)
      {
        printf("uncompress failed!\n");
        free(pCmp);
        free(pUncomp);
        return EXIT_FAILURE;
      }

      printf("Decompressed from %u to %u bytes\n", (mz_uint32)cmp_len, (mz_uint32)uncomp_len);

      // Ensure uncompress() returned the expected data.
      if ((uncomp_len != src_len) || (memcmp(pUncomp, s_pStr, (size_t)src_len)))
      {
        printf("Decompression failed!\n");
        free(pCmp);
        free(pUncomp);
        return EXIT_FAILURE;
      }
    }

    free(pCmp);
    free(pUncomp);

    step++;

    // Keep on fuzzy testing if there's a non-empty command line.
  } while (argc >= 2);

  printf("Success.\n");
  return EXIT_SUCCESS;
}

1 лайк

Автор темы @sav13 , а не “бабосик”.