12 советов о том, как правильно вести список дел
Наверное, вы уже составляете списки дел, чтобы не забыть ничего важного. Но всегда ли у вас хватает времени на то, чтобы выполнить все дела из списка?
Мы собрали для вас 12 советов, как правильно планировать свой день, тем самым увеличивая продуктивность и используя свое время по максимуму.
1) Пользуйтесь приложением
Хотя некоторые из нас предпочитают по старинке пользоваться ежедневником или клеить записки на монитор, такой список сложно все время держать под рукой. К тому же, ежедневник можно случайно оставить дома и из-за этого забыть что-то важное.
Большинство приложений-менеджеров задач могут синхронизироваться на всех ваших устройствах, так что у вас всегда будет доступ к списку дел: не только на рабочем месте, но и во время командировки, или на совещании.
На рынке приложений есть множество менеджеров задач с разным набором функций и интерфейсом, так что вы можете выбрать приложение по вкусу. Возможно, вам приглянется что-то из списка 9 лучших менеджеров задач по версии Forbes . Среди них есть как платные, так и бесплатные приложения, так что обратите внимание на описания и скриншоты.
Лично нам нравится Todoist из-за его простого и понятного интерфейса.
2) Планируйте свой день заранее
Планы на следующий день лучше всего составлять накануне вечером. Благодаря этому вы прямо с утра можете приступить к выполнению задач, не тратя лишнее время на размышления и расстановку приоритетов, и так список невыполненных задач будет сокращаться быстрее.
Попробуйте каждый вечер выделять 10 минут на то, чтобы распланировать завтрашний день. Используйте календарь или планировщик и выделите достаточно времени на каждую задачу. Если времени на все задачи не хватает, пересмотрите ваш список и расставьте приоритеты заново.
Не лишним будет в течение дня делать пометки о том, что вы хотите сделать завтра. Вечером рассортируйте эти заметки и добавьте их в календарь.
3) Разделяйте работу и личную жизнь.
В мире современных технологий разделять работу и личную жизнь бывает сложно, так что очень важно найти баланс. Не очень-то полезно во время работы волноваться о том, что нужно отвезти кота к ветеринару или забрать пуховик из химчистки, равно как и во время ужина с семьей или друзьями не совсем уместно думать о маркетинговых кампаниях или той презентации, которую вам нужно провести в понедельник. Из-за этого ваша производительность и сосредоточенность может снижаться, а уровень стресса — повышаться.
Разделяйте личные и рабочие задачи в вашем списке дел. Во многих менеджерах задач можно создавать отдельные списки, но если вы продолжаете невольно заглядывать в рабочий список дома или в личный список на работе, можете попробовать разные приложения.
Есть и другие варианты установления баланса между работой и личной жизнью. Интересные идеи можно почерпнуть в материале «Как соблюдать режим дня: 20 правил от гениев»
4) Составьте список того, чего делать не нужно
Если вам часто не хватает времени на выполнение всех задач из списка дел, попробуйте составить список того, чего делать не нужно. Проанализируйте всё то, чем вы занимаетесь, и попробуйте отказаться от вещей, которые не приносят особой пользы.
Задайте себе несколько вопросов о том, как вы проводите время на работе. На что вы тратите больше всего времени? Как определенные вещи меняют вашу жизнь? Полезны ли эти вещи для вашей карьеры? А для личной жизни? Составьте список вещей, которые не приносят пользы, не реализуемы или просто зря отнимают ваше время.
— Не назначайте встречи с каждым, кто об этом просит
— Не делайте вручную то, что можно автоматизировать
— Не тратьте много времени на мелочи (вроде выбора подходящего шрифта для заголовка)
Создание такого списка — это хорошее психологическое упражнение, которое поможет вам избавиться от вещей, расходующих ваше время и отвлекающих ваше внимание. Конечно, такой список не нужно составлять регулярно — достаточно обновлять его пару раз в год.
Если у вас пока нет вдохновения, можете переписать в свой список несколько пунктов отсюда или отсюда .
5) Сделайте ваш список дел доступным для других
Для этого есть несколько причин. Во-первых, так вы будете более ответственны. Если вы знаете, что у ваших коллег или знакомых есть доступ к списку ваших дел, вы, скорее всего, будете стараться лучше расставлять приоритеты и ставить реалистичные цели. Также это будет мотивировать вас на выполнение планов в обещанный срок.
Во-вторых, это необходимо в случае, если вы работаете над одной задачей с вашим деловым партнером или командой. Некоторые приложения (мы в Чатре используем Asana , но Basecamp тоже отличный инструмент) позволяют вам разделять задачи на подзадачи, и каждую подзадачу назначать нужному человеку. Благодаря таким приложениям вы можете держать коллег в курсе вашего прогресса, а также оставлять комментарии, если вам нужно что-то обсудить или уточнить.
6) Резервируйте время в календаре
Если вы пользуетесь приложением, которое позволяет вашим коллегам или клиентам получать доступ к вашему календарю, а также дает им возможность добавлять в него задачи или назначать встречи, вам стоит резервировать блоки времени, во время которых вы сможете заняться делами, не отвлекаясь ни на что другое.
Нужно набросать план речи? Зарезервируйте несколько часов после обеда или с утра. Предстоит встреча с важным клиентом, и хотите заранее уточнить некоторую информацию? Зарезервируйте полчаса перед встречей.
Крейг Джарроу, автор Time Management Ninja , однажды зарезервировал почти половину времени в своем календаре в Outlook и в каждый блок поставил задачу, которую ему нужно было выполнить. В результате неделя оказалась невероятно продуктивной. Благодаря резервированию времени он избежал приглашений на спонтанные совещания, смог выполнить свои обязательства и не позволил другим его отвлекать.
Совет от Time Management Ninja: используйте только один календарь. Можно использовать разные цвета для личных и рабочих задач, но календарь должен быть только один, если вы не хотите упустить что-нибудь важное.
7) Группируйте задачи
Мультизадачность — это миф . Даже если вам кажется, что вы легко справляетесь с несколькими задачами одновременно, исследование показывает, что наш мозг на это неспособен. Он не выполняет задачи одновременно, а просто быстро переключается между ними.
Предположим, вы отвечаете на письма, слушая музыку. Попробуйте одновременно печатать ответ и осознавать слова песни — скорее всего, это окажется довольно сложно. И каждый раз, когда вы переключаетесь между осознанием музыки и обдумыванием ответа, в вашем мозгу останавливается один процесс и запускается другой. Это влияет на нас негативно: из-за такого переключения мы тратим время (пусть и микросекунды) и энергию, работаем менее эффективно и рискуем допустить больше ошибок.
Возможно, во время рабочего дня вы часто отвлекаетесь — помимо работы над основной приоритетной задачей, вы проверяете почту, отвечаете на звонки и сообщения, слушаете голосовую почту, и т.д. Чтобы увеличить продуктивность, попробуйте группировать похожие задачи.
Несколько примеров того, что стоит сгруппировать:
- Электронная почта. Проверяйте почту и отвечайте на письма один или два раза в день вместо того, чтобы отвечать на них сразу (если вы, конечно, не работаете в поддержке). Например, выделите на это время перед обедом и вечером.
- Телефонные звонки. Записывайте куда-нибудь контакты всех людей, которым вам нужно позвонить, и раз в день совершайте все необходимые звонки за один заход. Время можете выбрать сами, но лучше исключить обеденные часы.
- Задачи. Когда у вас есть важные задачи, которые тем или иным образом между собой связаны, лучше выполнять их разом, одну за другой.
- Планирование. Выделите несколько часов на то, чтобы обдумать и спланировать вашу следующую крупную цель или идею.
- Отслеживание информации. Можно легко «подсесть» на проверку данных и постоянно проверять статистику вашего сайта или показатели по месячной выручке. Выделите на это отдельное время и проверяйте данные раз в неделю или месяц.
8) Назначайте срок исполнения задачи
У вас бывало такое, что у какой-то важной задачи не было конкретных временных рамок, и вы откладывали ее «на потом» до тех пор, пока задача не стала срочной?
Ставьте сроки исполнения для каждой задачи в вашем списке дел, особенно для важных задач. Постарайтесь назначать конкретные даты, потому что, продлив время исполнения однажды, вы, скорее всего, продлите его снова. Все сроки лучше сохранять в одном месте. Здесь вам пригодятся менеджеры задач — почти у всех подобных приложений есть возможность сортировки по срокам исполнения, благодаря чему вам будет легче расставлять приоритеты.
Разбивка задач на подзадачи тут тоже пригодится, потому что вы сможете обозначить сроки исполнения для каждой подзадачи, и благодаря этому вы более четко сможете осознавать, какие шаги вам нужно предпринять для достижения цели. Даже если у вас и не получится исполнить задачу в срок, учитесь на своих ошибках и избегайте подобного в будущем.
9) Избавьтесь от вещей, которые вас отвлекают, и боритесь с прокрастинацией
Современные технологии позволяют нам (а иногда даже и поощряют) постоянно быть онлайн, так что отвлечься от работы довольно легко. Вы начинаете работу над задачей, и вдруг вам приходит уведомление, что ваш друг отметил вас на фото, вы ненадолго открываете страничку в соцсети, и внезапно осознаете, что прошло уже пять часов, а вы смотрите ещё одно видео с котиками.
Мы все периодически становимся жертвами прокрастинации. Для борьбы с ней есть специальные приложения, которые не дадут вам отвлекаться от работы. Вы сами можете решить, насколько строгим оно должно быть — некоторые приложения просто подсчитывают время, которое вы проводите в соцсетях или на других «непродуктивных» сайтах, а некоторые приложения могут полностью блокировать доступ к таким сайтам. Вот несколько приложений, которые вы можете попробовать:
RescueTime — это условно бесплатное приложение для Windows, которое может подсчитывать, сколько времени вы тратите на разные действия, и показывать вам статистику. Вы можете ставить личные цели и указывать, какие действия являются для вас «продуктивными». Например, если вы работаете в сфере дизайна, то посещение Behance и работа в фоторедакторах — это часть рабочего процесса, а не отвлекающий элемент. Если у вас Mac, можете попробовать таймер Thyme .
Go F*cking Work — это бесплатное расширение для Chrome, которое будет материться каждый раз, когда вы заходите на сайты, которые вас отвлекают.
Freedom — это приложение для iPhone, iPad, Mac и Windows, которое позволяет вам блокировать определенные сайты или полностью блокировать интернет-соединение в течение определенного времени. Подписка стоит от 2.42 долларов в месяц, но у них есть бесплатный 7-дневный пробный период
Productivity Owl — еще одно бесплатное расширение для Chrome, которое позволяет вам заходить на сайты, которые вы укажете в настройках, но только на определенное время, так что вы сможете быстро найти нужную вам информацию и вернуться к работе. Вы также можете указать «свободное время», во время которого отключаются все ограничения.
Если вы не хотите использовать приложения, попробуйте просто перевести телефон в авиарежим.
10) Попробуйте технику помидора
Технику помидора (Pomodoro) придумал Франческо Чирилло в начале 90х. Техника получила такое название из-за того, что Франческо, на тот момент студент итальянского университета, пользовался таймером в виде помидора для отслеживания своей работы. Метод довольно прост: когда у вас есть задача или серия задач, вам нужно разбить работу на короткие отрезки времени (25 минут), разделенные небольшими паузами (5 минут). Такие отрезки называются «помидорами».
Запустите таймер или используйте специальное приложение и на 25 минут полностью погрузитесь в работу над задачей. Постарайтесь не отвлекаться на звонки или оповещения. Если вы вдруг вспомните, что вам нужно сделать что-то еще, запишите это на листке бумаги и продолжите работать. Когда таймер отсчитает 25 минут и подаст сигнал, сделайте паузу — разомнитесь, заварите себе чашечку кофе, помедитируйте или сделайте еще что-нибудь расслабляющее, не связанное с работой. И начните новый «помидор». После каждых 4 «помидоров» делайте большую паузу в 20-30 минут.
Нам нравится приложение Pomotodo , но вы можете использовать другое приложение, которое вам больше понравится. Их довольно много — от простых таймеров для браузера или телефона до специализированных инструментов.
У этой техники есть много преимуществ. Во-первых, она наглядно демонстрирует, сколько времени и усилий требуется на определенную задачу, так что вы сможете примерно представлять, сколько «помидоров» займет похожая задача. Во-вторых, так вы будете меньше отвлекаться — редкое сообщение бывает настолько важным, что не может подождать 25 минут.
Также благодаря технике помидора повышается качество вашей работы — обычно во время одного «помидора» вы работаете над одной задачей, и у вас, скорее всего, останется дополнительное время на то, чтобы проверить ошибки и «прилизать» работу. К тому же, если вы регулярно будете разделять свое рабочее время на «помидоры», это войдет в привычку, и вам гораздо легче будет придерживаться сроков и выполнять всё вовремя.
11) Награждайте себя за выполнение задач
Конечно, вычеркивание очередной задачи из вашего списка дел может доставлять удовольствие само по себе, но иногда нам нужна дополнительная мотивация для того, чтобы сосредоточиться на работе. Особенно, если вы делаете что-то, что вам не нравится. Тогда самое время придумать систему наград!
Например, после выполнения каждой задачи, вы можете позволить себе зайти на любимый сайт, съесть или выпить что-нибудь вкусное, или посмотреть интересное видео. Можете даже попробовать платить самому себе каждый раз, когда вы завершаете работу над особо сложным проектом. Например, вы можете завести сберегательный счет в банке, или класть деньги на аккаунт в Steam, или покупать подарочные карты в любимом магазине. В зависимости от неприятности и сложности выполнения задачи вы можете решать, сколько денег вы сами себе заплатите.
Когда вы завершаете работу над совсем уж крупным и важным проектом, наградите себя соответствующе — отправьтесь в небольшое путешествие, отведите семью или друзей в модный ресторан, или займитесь чем-нибудь, чем вы хотели заняться уже давно — например, запишитесь на мастер-класс по кулинарии, отправьтесь на дегустацию вин, или побалуйте себя походом в спа-центр. Вскоре вы даже начнете радоваться сложным задачам, так как они будут ассоциироваться у вас с вознаграждением.
12) Контролируйте температуру в помещении
Исследование показывает, что температура воздуха в офисе влияет на нашу продуктивность. Работники, которым приходилось работать в холодном помещении, делали на 44% больше ошибок, а их продуктивность сократилась почти вдвое.
К тому же, мерзнущие работники постоянно отвлекались, а их производительность каждый час снижалась на дополнительные 10%. Когда нам холодно, мы тратим энергию на обогрев тела, так что на концентрацию, понимание и вдохновение энергии остается меньше.
Негативно влияет на продуктивность и жара, ведь тогда организм задействует дополнительные ресурсы на поддержание теплового баланса.
Если у вас есть такая возможность, постарайтесь поддерживать в офисе температуру в районе 22 градусов, ну и не забывайте про хорошую вентиляцию и уровень влажности.
А как вы справляетесь со списками дел? Может, вы можете поделиться советом или ссылкой на хорошее приложение? Оставляйте комментарии!
Просто о списках, словарях и множествах или ТОП 5 структур данных
Привет. Ей! Не говорите “Да блин! Я знаю, чем отличается список от вектора, мне не нужна эта статья”. Прошу, загляните под кат и освежите свои знания. Я надеюсь, однако, что вы сможете почерпнуть из этой статьи намного больше и, некоторые, возможно, наконец-то разберутся, почему существует так много типов данных для коллекций объектов.
Введение
Так уж сложилось, что в программировании коллекции представляет много, нет ОЧЕНЬ МНОГО различных сущностей — списки, массивы, вектора, множества, стеки, очереди, ассоциативные массивы и у большинства из этих структур данных есть еще по несколько подвидов.
Должны же быть причины, чтобы для простого представления какой-либо совокупности объектов существовало настолько много различных вариаций.
Должны же быть отличия между списком и массивом? Между ассоциативным массивом и хеш-таблицей?
Коллекция
Для начала — самое скучное (да, я люблю такое). Что такое коллекция вообще?
Коллекция — структура данных (тип, класс, даже лучше сказать интерфейс), которая создана, чтобы содержать в себе некоторое количество объектов (в зависимости от языка и терминологии они должны быть одного типа или могут быть разных типов).
Различные типы коллекций могут быть статическими или динамическими, т.е. изменять свой размер или оставаться постоянными, могут быть упорядоченными (точнее учитывающими порядок элементов) и неупорядоченными (соответственно не учитывающими).
Над коллекциями предусмотрено несколько стандартных операций (сейчас мы поговорим о мутабельных, т.е. изменяемых коллекциях), таких как: получение размера, добавление элемента, удаление элемента, поиск (есть какой-либо элемент в коллекции или нет), их очень много.
Ладно, свой негласный долг я выполнил, теперь поехали!
1 Вектор (Vector, Array)
А вы чего ждали?
Вектор (он же одномерный массив) — упорядоченный набор элементов с произвольным доступом по числовому индексу. Что для нас важно в этом определении? Да ничего. Шучу, на самом деле нам важно почти каждое слово:
Доступ к элементам производится по числовому индексу (обычно начиная с 0-го индекса, хотя есть и исключения), обычно доступ к элементу коллекции по индексу записывается как myFavoriteCats[i] или blackKitties[5]. Причем для обозначения этого самого числа — индекса используют букву i.
А когда одной буквы не хватает приплетают сюда j и k.
Итак, далее мы понимаем, что доступ произвольный — значит мы можем обращаться к элементам под индексами 0, 42, 2014 и вобщем-то ожидаем, что операция будет сложности O(1), т.е. константной и независимо от того какой из элементов мы запросим он нам со скоростью света тут же вернется.
Далее — вектор — упорядоченная коллекция, что собственно понятно — у нас есть такие понятия как первый, последний элемент, для каждого конкретно взятого элемента мы также можем назвать предыдущий и следующий.
Релизация
Обычно вектор (как низкоуровневая структура) будет представлять из себя дескриптор, содержащий различную информацию, неотделимую от самой структуры (разумнее всего держать там только размер вектора) и указатель на первый элемент.
Такая реализация позволит за константное время получить доступ к произвольному элементу вектора по его индексу, а также позволит выполнять копирование, конкатенацию и другие простые операции на низком уровне.
И действительно, получить доступ к определенному элементу очень просто — прибавляем к указателю на первый элемент индекс (с некоторыми поправками на размер типа данных) и получаем указатель на нужный элемент! Осталось разыменовать и у нас в переменной нужная кошечка!
Ладно, вектор — классная структура, но и у него есть недостатки (а у кого их нет?!), например нельзя просто так взять и добавить в вектор новый элемент! Особенно втиснуть его в середину. Нельзя также сказать, что кошки с номерами 0, 1 и 4 у нас есть, а с номерами 2 и 3 — нет (раньше они были, но оказалось, что это собаки).
Можно представить себе вектор, как книжную полку с отделениями, в каждом из которых помещается ровно одна книга. Чтобы засунуть новый роман Донцовой между 10-ым и 11-ым томом Большой Совецкой Энциклопедии нужно сильно постараться и переложить все тома с 11-го по 65-ый тома (можно схитрить и поставить 11-ый том в конец, но я вам этого не говорил, да и мы в таком случае потеряем упорядоченность).
В моей памяти все именно так
Применение
В нашем случае вектор бы идеально подошел для топ-10 самых милых котят, т.к. добавлять и удалять элементы не нужно (только изменять), пропусков между 1-ым и 5-ым местом быть не должно, да и удобно обращаться по номеру.
Ладно. В любом случае вектор классный, мы просто посмотрим какие есть еще коллекции.
2 Список (List)
Первый том
Ух! Список задач на сегодня, список покупок в магазине. Список гостей на свадьбу… Так. Ближе к делу.
Мы уже знаем, что элементы вектора лежат акуратненько друг за другом, красиво и ровно. Это дает нам как преимущества так и недостатки.
Список в этом плане полностью противоположная вещь — его элементы могут быть разбросаны по памяти как угодно! Из-за этого мы теряем возможность быстро получить элемент по индексу, а также не можем быстро скопировать весь список, но получаем довольно приятную штуку — мы можем вставлять элементы за константное время в любое место! По слухам удаляются элементы из списка тоже за O(1).
Реализация
Хм. А как с формальным определением?
Список — упорядоченный набор элементов, для каждого из которых хранится указатель на следующий (или для двусвязного списка и на следующий и на предыдущий) элементы списка.
Для последнего элемента списка мы храним нулевой указатель (на диаграммах я буду использовать указатель на нулевую кошку (Null Cat), не пугайтесь).
Внимание! В каноничной реализации списка, для того, чтобы получить размер списка, необходимо обойти весь список — дойдя до нулевого указателя (линейное время — сложность O(n)) и хотя в некоторых реализациях размер кешируется в дескрипторе списка (или в первом элементе), не стоит на это полагаться.
Если бы я мог, я бы один элемент списка разместил на северном полюсе, а другой где-нибудь в окресностях Бетельгейзе
Применение
Список бы подошел для (внимание!) списка бездомных котят, отсортированных по возрасту (по возрастанию). Нам как-раз нужно часто добавлять и удалять элементы из списка (вы не подумайте ничего такого — котят забирают), да и чаще понадобятся первые элементы списка — я бы взял себе маленького пушистого котенка, а не 8-ми-летнего манула.
Ладно. Списки это вроде простая структура. Что есть еще?
3 Множество (Set)
Это Сет
Похожее понятие есть в математике, а точнее в теории множеств. Множество отличается и от вектора и от списка, хотя их реализация может быть похожа.
Множество — неупорядоченный набор элементов, без повторов. Ух. И все? Ни тебе произвольного доступа, ничего! Зачем такое нужно?
Как мы знаем в векторе можно быстро получить элемент по индексу, в списке можно быстро добавить или удалить элемент, а что с множеством?
В множестве можно быстро проверить, есть какой-либо элемент внутри, или его нет. Скажем если бы я хотел узнать, находится ли конкретная кошка в моем списке любимых, то и для списка и для вектора мне пришлось бы перебрать (в худжем случае) все элементы!
Реализация
В множестве, т.к. оно неупорядочено можно сортировать элементы при добавлении и в случае чего устроить бинарный поиск. Хм. Вот ведь парадокс, коллекция неупорядоченная, а внутри все будет по-порядку. Тут важно понять, что если вы добавите новый элемент в множество, не факт, что он пойдет в конец.
На самом деле, работая с множеством вообще нельзя полагаться на какой-либо порядок элементов, он может быть любым — именно поэтому множество и неупорядоченная коллекция.
Стоит отметить, что множество может быть реализовано множеством различных способов, например можно использовать хеширование, для еще более быстрого поиска элементов, поэтому подробно реализацию я рассматривать не буду. Скажу лишь, что можно схитрить и использовать наши знания по спискам.
Вообще есть еще упорядоченные множества, множества с повторами (мультимножество), и вероятно должно быть упорядоченное мультимножество.
Теория множеств дается проще, если брать множество котят
Применение
Множество идеально подойдет для списка любимых котят, потому что их множество. Ха! Шучу.
Но оно действительно подойдет, потому-что такую коллекцию не нужно сортировать (упорядоченность не важна) и мы легко сможем проверить, находится ли какой-нибудь конкретный кот в этом множестве (скажем у меня 100 котят и любимых я кормлю креветками).
Ну ладно. Множества тоже хороши, но неужели есть что-то еще?
4 Словарь (Associative Array, Map, Dictionary)
Признайтесь, это лучше, чем просто словарь
Словарь (он же ассоциативный массив) — это тот-же вектор, но с небольшими отличиями. В качестве индекса (который в словаре будет называться ключ) могут выступать не только числа, но и любые другие типы данных (даже другие коллекции!). Также допустимы пропуски, если мы все-таки будем использовать в качестве ключа целое число, например у нас может быть элемент связанный с ключем 5, но при этом отсутствовать элемент связанный с ключем 4.
Что все это значит на практике? Всего-лишь, то, что в квадратных скобках для ображения к элементу по “индексу” мы можем указывать произвольный тип, например allMyCats[“Murka”].
Реализация
Невооруженным видно, что можно просто завести массив (или список) пар (Ключ, Значение) и добавить специальную функцию, которая будет пробегать по этому списку и возвращать определенное значение по связанному с ним ключу.
Мы также не можем сказать какая пара первая, какая последняя и что раньше “Murka” или “Borka”, поэтому словарь считается неупорядоченной структурой.
Опять-же с каждым ключем может быть связано лишь одно значение, поэтому для приведенного примера с именами кошек словарь в чистом виде подходит слабо.
Реализация, как и в случае со множеством, может быть совершенно различной, можно упорядочить пары по ключу и использовать для получения элемента бинарный поиск (в таком случае элементы должны быть упорядочеваемыми). Опять-же можно реализовать словарь с помощью хеширования ключа, что довольно часто используется со строками.
Применение
Самый правдоподобный и грамотный способ — использовать словарь вместе со списком, где ключем словаря будет строка — имя кошки, а значением — список кошек с таким именем. Это позволит быстро найти всех кошек по имени Мурка и выбрать из них ту, которая в данный момент нужна.
Примерно так выглядит в памяти std::map>
И у меня для вас новость — типы коллекций закончились. Ну все. Вообще больше нет. Совсем.
5 Стек (Stack)
Еще один кот и будет Stack Overflow
Ха! Я вас обманул (всмысле пошутил)! Есть еще пара структур данных, которые представляют коллекции.
Итак стек — коллекция с необычным доступом, точнее с необычными правилами относительно того, как могут быть добавлены и удалены элементы.
Все просто — добавляемый элемент, называемый “последним”, первый выбывает из из стека.
Стек очень нужен и полезен в программировании. Например с помощью стека осуществляется вложенный вызов процедур — в стек сохраняются адрес возврата и аргументы вызванной функции.
Реализация
В высокоуровневой реализации ничего особенно интересного нет — указатель на список и элементы добавляются в начало этого списка, и удаляются с него-же.
В низкоуровневой реализации (точнее то, как он реализован в современных архитектурах) есть интересные моменты.
Стек там является небольшим зарезервированным участком памяти и совместно с ним хранится два указателя — на начало стека (где лежит первый доавленный элемент) и конец стека — где лежит последний добавленный.
Если в стек поместить слишком много данных программа завершится со всем знакомой ошибкой — Stack Overflow, это значит, что указатель на конец стека превысил верхний допустимый предел.
Также может случиться обратная ситуация (Stack Underflow), если попытаться забрать из стека больше чем в нем есть, но в высокоуровневых языках она не встречается (понятно почему — нам не дают напрямую работать со стеком).
Если кому интересно как это все работает — изучение ассемблера для какой-нибудь популярной архитектуры, вроде i386, может вам помочь.
Применение
Можно было-бы описать в этом месте стек из бедных котят высотой с гору, но на самом деле в высокоуровневых языках стек редко необходим, часто хватает рекурсии, которая использует стек неявно. Я не стал прикладывать надуманный пример (и не смог придумать нормальный, простите), поэтому переходим к следующему пункту.
Разное
На самом деле есть еще куча коллекций, таких как очередь, двусторонняя очередь (дек), двусвязанный список, кольцевое множество, очереди с приоритетом.
Есть деревья (да их целый лес!) и графы.
Есть вероятностные структуры данных, такие как вероятностное множество и список с пропусками.
Я очень хочу про все это написать, но времени и места на хабре не всегда мало.
Однако есть множество (или вектор) вещей, относящихся к теме, которые я хотел бы упомянуть хоть вскользь, да просит меня любопытный читатель и пойдет читать умную книгу.
Строки
В первую очередь то, как реализованы строки в некоторых языках может показаться странным. Самое простое и эффективное решение это наверное решение C — строка это набор символов, с нулевым символом в конце, что позволяет обходиться без дескриптора.
В C++ std::string уже больше походит на вектор.
Ну а в старом паскале дескриптор (точнее всего-лишь длина) хранится в нулевом элементе массива.
В Haskell String — это список символов ([Char]), из чего вытекает, что получение длины строки имеет сложность O(n). Зато их очень удобно оббегать рекурсивно.
В общем случае, строка — это упорядоченный набор символов и не более. Какой именно тип коллекции будет использован — не важно (ну я бы не советовал использовать множество, ха!).
Очередь (Queue)
Очередь очень похожа на стек и в тоже время является его противоположностью — первым мы получим обратно не тот элемент, что мы добавили последним, а тот, что “стоит в очереди” дольше всех. Очередь очень удобная структура, но несмотря, на то, что принцип ее работы схож со стеком, в эффективной реализации есть небольшое отличие.
Для стека мы могли схитрить и выделить приемлемый по размеру участок памяти, в случае чего его расширяя, потому-что стек то уменьшается, то увеличивается, т.к. элементы и добавляются и удаляются “с одного конца”. Если же мы представим работу очереди, то она будет “ползти в памяти” — начало будет постоянно сдвигаться вверх, поэтому трюк, который применим для стека, будет работать хуже и тут уже намного лучше будет использовать двусвязный список (и не забудьте хранить указатели на первый и последний элементы).
Еще можете попробовать реализвать очередь на двух стеках, но это тоже менее эффективно.
Также есть дек (двусторонняя очередь — deque). В ней можно добавлять элементы как в конец, так и в начало. И забирать их тоже и с конца и с начала.
Заключение
Ух. Я начинаю повторяться
Я совсем не упомянул, про комбинирование различных коллекций, благодаря которым образуются матрицы, таблицы. Также я не затронул деревья, кольцевое множество, почти ничего не написал про очереди, очень мало информации по хешированию (я таки отделался парой слов от этой темы) и другим методам оптимизации.
Однако я думаю статья исполнит свою роль — просто и понятно изложит основы структур данных для читателей разной степени подготовленности. И я буду рад продолжить и осветить множество (или очередь, ха!) других тем в таком-же ключе.
Спасибо тем, кто смог дочитать аж до этих строк (как они это выдержали?).
Перевод «у нас в списке» на английский
Как я уже говорил вначале, уважаемая представительница Колумбии является у нас в списке единственным оратором на сегодня.
As I announced at the outset, the distinguished representative of Colombia is the only speaker on the list for today.
Кто у нас в списке избранных?
По сведениям из секретариата, других ораторов на сегодня у нас в списке не значится.
According to the secretariat, there are no speakers on my list for today.
В этой связи я хотел бы освободить вас от необходимости упоминать об этом в своих выступления, поскольку у нас в списке еще 16 ораторов.
In this regard, I would like to free you from having to make this reference in your statements because we still have 16 speakers on the list.
В настоящий момент у нас в списке числятся еще 24 оратора, но я не исключаю, что их число может увеличиться.
Currently we have about 24 other speakers actually inscribed and my expectation is that that list may well increase.
Председатель (говорит по-испански): Я напоминаю представителям, что на сегодняшнем утреннем заседании у нас в списке еще четыре оратора.
The Chairperson (spoke in Spanish): I remind representatives that we still have four speakers on our list for this morning.
«Газомоторное топливо, а в особенности сжиженный газ, у нас в списке приоритетов.
Gas-powered fuel, especially liquefied gas, is on our priority list.
«Да у нас в списке свои люди!
We have women on our list!
Хотя у нас в списке есть еще шесть делегаций, мы могли бы попросить всю шестерку выступить с краткими и простыми заявлениями, с тем чтобы каждый мог взять слово на этом сегодняшнем заседании.
Although we still have six delegations on the list, we could request that all six make short and simple statements so that everyone is able to take the floor at this meeting today.
Как я уже говорил, у нас в списке есть еще шесть ораторов, и я предоставляю слово послу Италии.
As I mentioned, we have six more speakers on the list, and I give the floor to the Ambassador of Italy.
Возможно неприемлемое содержание
Примеры предназначены только для помощи в переводе искомых слов и выражений в различных контекстах. Мы не выбираем и не утверждаем примеры, и они могут содержать неприемлемые слова или идеи. Пожалуйста, сообщайте нам о примерах, которые, на Ваш взгляд, необходимо исправить или удалить. Грубые или разговорные переводы обычно отмечены красным или оранжевым цветом.
Зарегистрируйтесь, чтобы увидеть больше примеров. Это просто и бесплатно
Ничего не найдено для этого значения.
Предложить пример
Больше примеров Предложить пример
Новое: Reverso для Windows
Переводите текст из любого приложения одним щелчком мыши .
Скачать бесплатно
Перевод голосом, функции оффлайн, синонимы, спряжение, обучающие игры
Результатов: 44 . Точных совпадений: 44 . Затраченное время: 97 мс
Помогаем миллионам людей и компаний общаться более эффективно на всех языках.
Массивы
В финальной статье этого раздела, мы познакомимся с массивами — лаконичным способом хранения списка элементов под одним именем. Мы поймём, чем они полезны, затем узнаем, как создать массив, получить, добавить и удалить элементы, хранящиеся в массиве.
Необходимые навыки: | Базовая компьютерная грамотность, базовое понимание HTML и CSS, понимание о том, что такое JavaScript. |
---|---|
Цель: | Понять, что такое массивы и как использовать их в JavaScript. |
Что такое массив?
Массивы обычно описываются как «объекты, подобные спискам»; они представляют собой в основном отдельные объекты, которые содержат несколько значений, хранящихся в списке. Объекты массива могут храниться в переменных и обрабатываться во многом так же, как и любой другой тип значения, причём разница заключается в том, что мы можем получить доступ к каждому значению внутри списка отдельно и делать супер полезные и эффективные вещи со списком, а также делать то же самое для каждого из значений. Представим, что у нас есть список продуктов и их цены, хранящиеся в массиве, и мы хотим их просмотреть и распечатать на счёте-фактуре, общая сумма всех цен и распечатка общей цены внизу.
Если бы у нас не было массивов, мы должны были бы хранить каждый элемент в отдельной переменной, а затем вызывать код, выполняющий печать и добавляющий отдельно каждый элемент. Написание такого кода займёт намного больше времени, сам код будет менее эффективным и подверженным ошибкам. Если бы у нас было 10 элементов для добавления в счёт-фактуру, это ещё куда ни шло, но как насчёт 100 предметов? Или 1000? Мы вернёмся к этому примеру позже в статье.
Как и в предыдущих статьях, давайте узнаем о реальных основах работы с массивами, введя некоторые примеры в консоль разработчика.
Создание массива
Массивы создаются из квадратных скобок , которые содержат список элементов, разделённых запятыми.
-
Допустим, мы бы хотели хранить список покупок в массиве — мы бы сделали что-то вроде этого. Введите следующие строчки в вашу консоль:
var shopping = ["bread", "milk", "cheese", "hummus", "noodles"]; shopping;
var sequence = [1, 1, 2, 3, 5, 8, 13]; var random = ["tree", 795, [0, 1, 2]];
Получение и изменение элементов массива
Вы можете после этого получать доступ к отдельным элементам в массиве, используя квадратные скобки, таким же способом каким вы получаете доступ к буквам в строке.
-
Введите следующее в вашу консоль:
[0]; // возвращает "bread"
[0] = "tahini"; shopping; // shopping теперь возвратит [ "tahini", "milk", "cheese", "hummus", "noodles" ]
Примечание: Мы уже упоминали это прежде, но просто как напоминание — компьютеры начинают считать с нуля!
Нахождение длины массива
Вы можете найти длину массива (количество элементов в нём) точно таким же способом, как вы находите длину строки (в символах) — используя свойство length . Попробуйте следующее:
.length; // должно возвратить 7
Это свойство имеет и другие применения, но чаще всего используется, чтобы сказать, что цикл продолжается, пока он не зациклится на всех элементах массива. Так, например:
var sequence = [1, 1, 2, 3, 5, 8, 13]; for (var i = 0; i sequence.length; i++) console.log(sequence[i]); >
В будущих статьях вы узнаете о циклах, но вкратце этот код говорит:
- Начать цикл с номера позиции 0 в массиве.
- Остановить цикл на номере элемента, равном длине массива. Это будет работать для массива любой длины, но в этом случае он остановит цикл на элементе номер 7 (это хорошо, поскольку последний элемент, который мы хотим, чтобы цикл был закрыт, равен 6).
- Для каждого элемента вернуть его значение в консоли браузера с помощью console.log() .
Некоторые полезные методы массивов
В этом разделе мы рассмотрим некоторые полезные методы, связанные с массивом, которые позволяют нам разбивать строки на элементы массива и наоборот, а также добавлять новые элементы в массивы.
Преобразование между строками и массивами
Часто у вас могут быть некоторые необработанные данные, содержащиеся в большой длинной строке, и вы можете захотеть разделить полезные пункты до более удобной и полезной формы, а затем сделать что-то для них, например отобразить их в таблице данных. Для этого мы можем использовать метод split () . В его простейшей форме он принимает единственный параметр, символ, который вы хотите отделить в строке, и возвращает подстроки между разделителем как элементы в массиве.
Примечание: Хорошо, технически это строковый метод, не метод массива, но мы поместили его в массивы, так как он хорошо подходит для них.
- Поиграем с этим, посмотрим как это работает. Сначала, создадим строку в вашей консоли:
var myData = "Manchester,London,Liverpool,Birmingham,Leeds,Carlisle";
var myArray = myData.split(","); myArray;
.length; myArray[0]; // первый элемент в массиве myArray[1]; // второй элемент в массиве myArray[myArray.length - 1]; // последний элемент в массиве
var myNewString = myArray.join(","); myNewString;
var dogNames = ["Rocket", "Flash", "Bella", "Slugger"]; dogNames.toString(); //Rocket,Flash,Bella,Slugger
Добавление и удаление элементов массива
Мы ещё не рассмотрели добавление и удаление элементов массива — давайте посмотрим на это сейчас. Мы будем использовать массив myArray , с которым мы столкнулись в предыдущем разделе. Если вы ещё не прошли этот раздел, сначала создайте массив в консоли:
var myArray = [ "Manchester", "London", "Liverpool", "Birmingham", "Leeds", "Carlisle", ];
Прежде всего, чтобы добавить или удалить элемент с конца массива, мы можем использовать push() и pop() соответственно.
-
Давайте сначала используем метод push() — заметьте, что вам нужно указать один или более элементов, которые вы хотите добавить в конец своего массива. Попробуйте это:
.push("Cardiff"); myArray; myArray.push("Bradford", "Brighton"); myArray;
var newLength = myArray.push("Bristol"); myArray; newLength;
var removedItem = myArray.pop(); myArray; removedItem;
unshift() и shift() работают точно таким же способом, за исключением того что они работают в начале массива, а не в конце.
-
Сначала, попробуем метод unshift() :
.unshift("Edinburgh"); myArray;
var removedItem = myArray.shift(); myArray; removedItem;
Практика: Печать продуктов!
Вернёмся к описанному выше примеру — распечатываем названия продуктов и цен на счёт-фактуру, затем суммируем цены и печатаем их внизу. В приведённом ниже редактируемом примере есть комментарии, содержащие числа — каждая из этих отметок является местом, где вы должны добавить что-то в код. Они заключаются в следующем:
- Ниже комментария // number 1 имеется ряд строк, каждая из которых содержит название продукта и цену, разделённые двоеточием. Нужно превратить их в массив и сохранить его под названием products .
- На строке с комментарием // number 2 начинается цикл for. В строке цикла имеется i
- Под комментарием // number 3 мы хотим, чтобы вы написали строку кода, которая разбивает текущий элемент массива ( name:price ) на два отдельных элемента: один содержит только имя, а другой — содержащее только цену. Если не знаете, как это сделать, ещё раз просмотрите статью Полезные строковые методы, а лучше, посмотрите раздел Преобразование между строками и массивами этой статьи.
- В рамках приведённой выше строки нужно преобразовать цену из строки в число. Если не помните, как это сделать, ознакомьтесь со статьёй строки в JavaScript.
- В верхней части кода есть переменная с именем total , которая содержит значение 0 . Внутри цикла (под комментарием // number 4 ) нужно добавить строку, которая добавляет текущую цену товара к этой сумме на каждой итерации цикла, так чтобы в конце кода была выведена корректная сумма в счёт-фактуре. Для этого вам может понадобится оператор присваивания.
- Под комментарием // number 5 нужно изменить строку так, чтобы переменная itemText была равна «current item name — $current item price», например «Shoes — $23.99» для каждого случая, чтобы корректная информация для каждого элемента была напечатана в счёте-фактуре. Здесь обычная конкатенация строк, которая должна быть вам знакома.
h2>Live outputh2> div class="output" style="min-height: 150px;"> ul>ul> p>p> div> h2>Editable codeh2> p class="a11y-label"> Press Esc to move focus away from the code area (Tab inserts a tab character). p> textarea id="code" class="playable-code" style="height: 410px;width: 95%"> var list = document.querySelector('.output ul'); var totalBox = document.querySelector('.output p'); var total = 0; list.innerHTML = ''; totalBox.textContent = ''; // number 1 'Underpants:6.99' 'Socks:5.99' 'T-shirt:14.99' 'Trousers:31.99' 'Shoes:23.99'; for (var i = 0; i totalBox.textContent = 'Total: $' + total.toFixed(2); textarea> div class="playable-buttons"> input id="reset" type="button" value="Reset" /> input id="solution" type="button" value="Show solution" /> div>
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode() eval(textarea.value); > reset.addEventListener("click", function () textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Show solution"; updateCode(); >); solution.addEventListener("click", function () if (solution.value === "Show solution") textarea.value = solutionEntry; solution.value = "Hide solution"; > else textarea.value = userEntry; solution.value = "Show solution"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nvar totalBox = document.querySelector('.output p');\nvar total = 0;\nlist.innerHTML = '';\ntotalBox.textContent = '';\n\nvar products = ['Underpants:6.99',\n 'Socks:5.99',\n 'T-shirt:14.99',\n 'Trousers:31.99',\n 'Shoes:23.99'];\n\nfor(var i = 0; i < products.length; i++) \n\ntotalBox.textContent = 'Total: $' + total.toFixed(2);"; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e) if (e.keyCode === 9) e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27) textarea.blur(); > >; function insertAtCaret(text) var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function () // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Show solution") userEntry = textarea.value; > else solutionEntry = textarea.value; > updateCode(); >;
html font-family: sans-serif; > h2 font-size: 16px; > .a11y-label margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body margin: 10px; background-color: #f5f9fa; >
Практика: Топ 5 поисковых запросов
Хорошим тоном, является использование методов массива, таких как push () и pop () — это когда вы ведёте запись активных элементов в веб-приложении. Например, в анимированной сцене может быть массив объектов, представляющих текущую отображаемую фоновую графику и вам может потребоваться только 50 одновременных отображений по причинам производительности или беспорядка. Когда новые объекты создаются и добавляются в массив, более старые могут быть удалены из массива для поддержания нужного числа.
В этом примере мы собираемся показать гораздо более простое использование — ниже мы даём вам поддельный поисковый сайт с полем поиска. Идея заключается в том, что когда в поле поиска вводятся запросы, в списке отображаются 5 предыдущих поисковых запросов. Когда число терминов превышает 5, последний член начинает удаляться каждый раз, когда новый член добавляется в начало, поэтому всегда отображаются 5 предыдущих терминов.
Примечание: В реальном приложении для поиска вы, вероятно, сможете щёлкнуть предыдущие условия поиска, чтобы вернуться к предыдущим поисковым запросам и отобразите фактические результаты поиска! На данный момент мы просто сохраняем его.
Чтобы завершить приложение, вам необходимо:
- Добавьте строку под комментарием // number 1 , которая добавляет текущее значение, введённое в ввод поиска, к началу массива. Его можно получить с помощью searchInput.value .
- Добавьте строку под комментарием // number 2 , которая удаляет значение, находящееся в конце массива.
h2>Live outputh2> div class="output" style="min-height: 150px;"> input type="text" />button>Searchbutton> ul>ul> div> h2>Editable codeh2> p class="a11y-label"> Press Esc to move focus away from the code area (Tab inserts a tab character). p> textarea id="code" class="playable-code" style="height: 370px; width: 95%"> var list = document.querySelector('.output ul'); var searchInput = document.querySelector('.output input'); var searchBtn = document.querySelector('.output button'); list.innerHTML = ''; var myHistory = []; searchBtn.onclick = function() < // we will only allow a term to be entered if the search input isn't empty if (searchInput.value !== '') < // number 1 // empty the list so that we don't display duplicate entries // the display is regenerated every time a search term is entered. list.innerHTML = ''; // loop through the array, and display all the search terms in the list for (var i = 0; i < myHistory.length; i++) < itemText = myHistory[i]; var listItem = document.createElement('li'); listItem.textContent = itemText; list.appendChild(listItem); >// If the array length is 5 or more, remove the oldest search term if (myHistory.length >= 5) < // number 2 >// empty the search input and focus it, ready for the next term to be entered searchInput.value = ''; searchInput.focus(); > > textarea> div class="playable-buttons"> input id="reset" type="button" value="Reset" /> input id="solution" type="button" value="Show solution" /> div>
html font-family: sans-serif; > h2 font-size: 16px; > .a11y-label margin: 0; text-align: right; font-size: 0.7rem; width: 98%; > body margin: 10px; background: #f5f9fa; >
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var solution = document.getElementById("solution"); var code = textarea.value; var userEntry = textarea.value; function updateCode() eval(textarea.value); > reset.addEventListener("click", function () textarea.value = code; userEntry = textarea.value; solutionEntry = jsSolution; solution.value = "Show solution"; updateCode(); >); solution.addEventListener("click", function () if (solution.value === "Show solution") textarea.value = solutionEntry; solution.value = "Hide solution"; > else textarea.value = userEntry; solution.value = "Show solution"; > updateCode(); >); var jsSolution = "var list = document.querySelector('.output ul');\nvar searchInput = document.querySelector('.output input');\nvar searchBtn = document.querySelector('.output button');\n\nlist.innerHTML = '';\n\nvar myHistory= [];\n\nsearchBtn.onclick = function() \n\n if(myHistory.length >= 5) \n\n searchInput.value = '';\n searchInput.focus();\n >\n>"; var solutionEntry = jsSolution; textarea.addEventListener("input", updateCode); window.addEventListener("load", updateCode); // stop tab key tabbing out of textarea and // make it write a tab at the caret position instead textarea.onkeydown = function (e) if (e.keyCode === 9) e.preventDefault(); insertAtCaret("\t"); > if (e.keyCode === 27) textarea.blur(); > >; function insertAtCaret(text) var scrollPos = textarea.scrollTop; var caretPos = textarea.selectionStart; var front = textarea.value.substring(0, caretPos); var back = textarea.value.substring( textarea.selectionEnd, textarea.value.length, ); textarea.value = front + text + back; caretPos = caretPos + text.length; textarea.selectionStart = caretPos; textarea.selectionEnd = caretPos; textarea.focus(); textarea.scrollTop = scrollPos; > // Update the saved userCode every time the user updates the text area code textarea.onkeyup = function () // We only want to save the state when the user code is being shown, // not the solution, so that solution is not saved over the user code if (solution.value === "Show solution") userEntry = textarea.value; > else solutionEntry = textarea.value; > updateCode(); >;
Заключение
Прочитав эту статью, мы уверены, что вы согласитесь, что массивы кажутся довольно полезными; вы увидите, что они появляются повсюду в JavaScript, часто в сочетании с циклами, чтобы делать то же самое для каждого элемента массива. Мы научим вас всем полезным основам, которые нужно знать о циклах в следующем модуле, но пока вы должны себе похлопать и воспользоваться заслуженным перерывом; вы проработали все статьи в этом модуле!
Осталось только выполнить тестовую задачу, которая проверит ваше понимание статей, которые вы прочли до этого момента. Удачи!
Посмотрите также
- Indexed collections — an advanced level guide to arrays and their cousins, typed arrays.
- Array — the Array object reference page — for a detailed reference guide to the features discussed in this page, and many more.
- Назад
- Обзор: Первые шаги
- Далее
В этом разделе
- Что такое JavaScript?
- A first splash into JavaScript
- What went wrong? Troubleshooting JavaScript
- Storing the information you need — Variables
- Basic math in JavaScript — numbers and operators
- Handling text — strings in JavaScript
- Useful string methods
- Массивы
- Assessment: Silly story generator