Итак, на днях у меня было это интервью, верно? Мы болтали о его проекте, о том, над чем я работал, и обо всем этом хорошем. Все шло отлично! И вот настал момент:
"Хорошо, я задам вам несколько технических вопросов"
У тебя есть это, Брайан! Вы читали все эти книги, вы занимались программированием, вы готовы! Они начали, и у меня все было хорошо.
Потом возник вопрос, и я пошутил. Я действительно не жду ответа от них. Но все в порядке! Я куплю их в следующий раз!
Я узнал, что быть программистом-самоучкой означает, что в вашей базе знаний, вероятно, будут серьезные дыры. Спросите меня, когда я буду использовать функциональный компонент без состояния вместо обычного класса React (когда не нужны методы состояния или жизненного цикла), и я золотой. Попросите меня выяснить, является ли эта функция O (logN), O (! N) или O (god_pls_help_me), и я скажу последнее.
Я узнал то, что мне нужно было знать, или что хотел знать, но не совсем то, что менеджеры по найму хотели бы, чтобы я знал. Итак, я здесь, чтобы поговорить о том, чего я не знаю!
Может быть, мы сможем чему-то научиться вместе! (Я мог бы написать другие из них, но, может быть, не потому, что я заведомо плохой блогер).
Вот так. Давай, тигр!
(примечание: книга, которую я читал, Справочник самозванца Роба Конери потрясающая, и я не могу ее рекомендовать. Тот факт, что я знаю, что такое лямбда-исчисление, теперь говорит о многом.)
Связанные списки и массивы
Моя отмена из предыдущего анекдота.
Я уверен, что все мы знаем, что такое массив, верно?
['full', 'of', 'neat', 'stuff']
← массив, полный интересных вещей.
Как насчет связанного списка? Это примерно так:
let aLinkedList = {data: 'full', next: ->}, {data: 'of', next: ->}, {data: 'confusing', next: ->}, {data: 'stuff', next: null}
Что-то вроде того? По сути, это объект с некоторыми данными и указатель на следующий бит данных. Лучшее представление, украденное из интернета:
Так в чем разница? Когда мы будем использовать одно вместо другого? Мой первоначальный ответ был примерно таким:
«* Mumble mumble * что-то насчет производительности ... обхода ... памяти? * кашель * кашель * следующий вопрос, пожалуйста »
Теперь, когда я кое-что прочитал, давайте поговорим об этом. Возможно, вы будете готовы, когда менеджер по найму румян / разработчик / рекрутер задаст вам этот вопрос.
Связанные списки удобны, когда вы будете часто добавлять и удалять объекты из случайных мест в списке. Массивы должны знать размер заранее, и они сохраняются как большой кусок данных. Связанные списки - это просто фрагменты информации с указателем на следующий фрагмент информации, поэтому изменение их размера на самом деле не слишком мешает. Например:
let anArray = [1,2,3,4,5,6] ; anArray.length; // 6 // now lets remove 3... anArray = anArray.slice(0,2).concat(anArray.slice(3)); anArray; // [1,2,4,5,6] anArray.length; // 5
Ого. Мало того, что это было проблемой, но после того, как мы удалили элемент, нашей программе пришлось вернуться и перераспределить пространство для массива, сдвигая индекс каждого элемента после того, который мы удалили, назад, чтобы заполнить пробел.
Сейчас это не так уж важно, когда мы работаем с 6 элементами, но как насчет 10 000? 10 000 000? Гугл? Идк, как я уже сказал, я новичок во всем этом CS, но похоже, что это может быть довольно большой проблемой.
При использовании связанного списка все, что нам нужно сделать, это:
Не нужно ничего тасовать. Просто удалите наш элемент и измените предыдущий указатель на элемент после удаленного.
Так что это круто. А как насчет массивов?
Массивы лучше… кажется, в большинстве случаев. Мы получаем несколько хороших методов с уже существующими массивами, такими как push / pop / shift / unshift и slice / length / join / sort / reverse. Кроме того, у них есть дополнительный бонус в виде индекса, связанного с каждым элементом. Благодаря этому мы можем легко случайным образом вытащить искомый предмет.
let anArray = [1,2,3,4,5,6]; anArray[1]; // 2 anArray[anArray.length - 1]; // 6
Возможности, которые мы получаем, добавляя и удаляя элементы в связанном списке, немного уменьшаются, когда нам нужно просмотреть каждый элемент, чтобы проверить, является ли он тем, что мы ищем. Это довольно отстойно.
So:
Будете ли вы добавлять и удалять множество вещей по всему массиву И только упорядоченно? Возможно, вы хотите использовать связанный список.
Вам нужно будет часто находить случайные кусочки материала из списка? Наверное, лучше с массивом.
Это ни в коем случае не является исчерпывающим или даже полностью информативным. Есть много случаев использования, когда один может быть лучше оснащен, чем другой, и гораздо больше, когда ваших личных предпочтений, вероятно, достаточно. Но послушайте, надеюсь, после прочтения этого вы сможете хотя бы выдать немного больше информации, чем я, если кто-то задаст вам этот вопрос.
До следующего раза.
❤ Брайан
@spacebrayn в Твиттере, но у меня это действительно плохо получается. Ударь меня, и мы поговорим о ботанском дерьме.