Ми плануємо збудувати будиночок на дереві в лісі неподалік від нашого дому, щоб спостерігати за сходом і заходом сонця.
Ми отримали дані від місцевої геодезичної компанії про висоту кожного дерева в кожній прямокутній ділянці карти. Нам потрібно проаналізувати кожну сітку на карті, щоб знайти гарні дерева для нашого будиночка на дереві.
Гарне дерево має бути одночасно:
Наше завдання - знайти потенційні дерева, на яких можна збудувати будиночок.
Компанія з даних надає дані у вигляді сіток, які показують висоти дерев. Рядки сітки відповідають напрямку схід-захід, а стовпці - напрямку північ-південь.
Придатним буде дерево, найбільше у своєму рядку і водночас найменше у своєму стовпці.
У сітці може взагалі не бути хороших дерев. Або може бути одне, або навіть кілька.
Ось сітка, у якій є рівно одне дерево-кандидат.
↓
1 2 3 4
|-----------
1 | 9 8 7 8
→ 2 |[5] 3 2 4
3 | 6 6 7 1
Отже, точка [2, 1] (рядок: 2, стовпець: 1) - чудове місце для будиночка на дереві.
За домовленістю, вміст упорядкованих послідовностей значень у Rust нумерується («індексується»), починаючи з 0. Це так незалежно від того, що каже решта опису вправи в цьому README, зокрема посилання на індекси, які починаються з 1, тож, щоб перевести ці номери індексів у номери індексів Rust, доведеться відняти 1.
У цій вправі для зберігання вмісту матриць використовується вектор векторів. Хоча цю вправу створено, щоб допомогти учням зрозуміти базові поняття про вектори, як-от індексування, і те, що вкладені типи даних допустимі, вектор векторів - неоптимальний вибір для високопродуктивної матричної алгебри та будь-якої подібної ефективної обробки більших обсягів даних.
Докладне пояснення цієї неефективності виходить за межі цієї вправи і цього навчального треку загалом. Цей аспект відомий як локальність кешу. Якщо ми хочемо дізнатися більше про деталі сучасної компʼютерної архітектури, гарний вступ до нього можна знайти, перейшовши за цим посиланням.