Функция уже использует линейный поиск с ранним выходом. Рефакторинг может улучшить имена и убрать повторное индексирование, но сам по себе не меняет сложность 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 ускорит частые поиски, но это отдельное изменение структуры данных, а не косметический рефакторинг.