Оптимизация функции поиска ячейки в массиве

Функция уже использует линейный поиск с ранним выходом. Рефакторинг может улучшить имена и убрать повторное индексирование, но сам по себе не меняет сложность O(n).

Короткий ответ

Что ответить на собеседовании

Функция уже использует линейный поиск с ранним выходом. Рефакторинг может улучшить имена и убрать повторное индексирование, но сам по себе не меняет сложность O(n).

Подробный разбор

Ответ с пояснениями

Условие

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

/**
 * @fn ueUtlFndCell
 *
 * @brief Fill cell control block from cellArr by \p cellId
 *
 * @param[in]  targetCellId   идентификатор искомой ячейки
 * @param[out] outCell        указатель для хранения найденного блока управления.
 * @return     ROK on success
 *             RFAILED if cellId not found.
 */
PUBLIC S16 ueUtlFndCell(U16 targetCellId, CellCb **outCell)
{
    TRC2(ueUtlFndCell)

    for (U16 idx = 0; idx < UE_NUM_CELLS; idx++) {
        if (targetCellId == cellArr[idx].cellId) {
            *outCell = &cellArr[idx];
            RETVALUE(ROK);
        }
    }

    UE_LOG(UE_APP, UE_LOG_ERROR, "ueUtlFndCell: CellCb not found for cell id: %d\n", targetCellId);
    *outCell = NULLP;
    RETVALUE(RFAILED);
}

Ответ

Функция уже использует линейный поиск с ранним выходом. Рефакторинг может улучшить имена и убрать повторное индексирование, но сам по себе не меняет сложность O(n).

Сохраняя исходный контракт ненулевого outCell и платформенные макросы:

PUBLIC S16 ueUtlFndCell(U16 targetCellId, CellCb **outCell)
{
    TRC2(ueUtlFndCell)
    for (U16 cellIndex = 0; cellIndex < UE_NUM_CELLS; ++cellIndex) {
        CellCb *candidate = &cellArr[cellIndex];
        if (candidate->cellId == targetCellId) {
            *outCell = candidate;
            RETVALUE(ROK);
        }
    }
    UE_LOG(UE_APP, UE_LOG_ERROR,
        "ueUtlFndCell: CellCb not found for cell id: %d\n", targetCellId);
    *outCell = NULLP;
    RETVALUE(RFAILED);
}

На успехе возвращается первая совпавшая ячейка, на неуспехе указатель обнуляется. Диапазон UE_NUM_CELLS должен помещаться в выбранный счётчик. Индекс по ID ускорит частые поиски, но это отдельное изменение структуры данных, а не косметический рефакторинг.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее