Map что это




Про Java

О разработке: субъективно и просто

среда, 31 октября 2012 г.

HashSet и HashMap

Самые распространенные вопросы для собеседований можно собрать в группы. И одной из самых частых групп являются вопросы о Collection framework. Об одном из аспектов этого фреймворка мы сегодня и поговорим.

Говорить о классах Collections framework, как и о сортировке и поиске данных можно много, поэтому давайте организуем пост в виде вопросов и ответов. А вопросы постараемся задать такие же, как это делают интервьюеры.

Что такое Map и для чего он нужен?

Map — интерфейс, описывающий классы, предназначенные для хранения пар объектов. Один из объектов пары должен быть уникальным — называется «ключом» (key), второй объект, необязательно уникальный, называется «значением» (value). Всю пару называют «записью» (entry).

Как определить уникальность ключа?

Вспомним предыдущий абзац. Уникальный — значит не равный другим ключам. Как определить «равность»? По функции equals(), определяемой в классе Object, а потому доступной для всех объектов. Про тонкости equals() и ее переопределения в другом посте, а пока для нас достаточно знать, что ключи в Map сравниваются по методу equals(), и при попытке добавить в Map запись с не уникальным ключом предыдущая запись будет затерта новой.

Какие реализации Map вы знаете?

HashMap, TreeMap, LinkedHashMap

Поговорим теперь конкретно о HashMap

Как HashMap устроен внутри?

Внутри HashMap — это массив. Элементы массива в документации называются бакетами (buckets). Будем следовать этому наименованию и мы. В бакете хранится первый элемент связанного списка. Вообще связанные списки можно обсудить в другом посте, главное, что нужно знать, связанный список — это цепочка объектов, каждый из которых имеет ссылку на следующий объект из цепочки. Имея первый элемент, можно по цепочке добраться до всех элементов списка. Таким образом, HashMap внутри — массив связанных списков. Элемент связанного списка — объект класса Entry, содержит ключ, значение и ссылку на следующий Entry.

Что происходит при добавлении записи?

Сначала вычисляется hashcode() ключа. Функция hashcode() определена в классе Object, так что даже если вы не переопределите ее в своем классе ключа, она все равно сработает. Выдаст адрес обьекта в памяти или еще какое-нибудь случайное число (int). Затем из двух значений — hashcode и размер массива — математически вычисляется индекс бакета, соответствующего hashcode. Главное, что нужно тут знать — соответствие между ключом и бакетом не хранится, оно вычисляется.
Далее, найдя нужный бакет, запись помещается в соответствующий связанный список.

А как искать элемент?

Поиск производится по ключу (ключ для поиска). Опять же по hashcode() ключа находим нужный бакет. Нашли бакет — значит нашли нужный нам связанный список. Далее проходим по списку и сравниваем ключи элементов списка с нашим ключом для поиска. Сравнение производим по функции equals(). Вернула функция true — значит нашли.

И для чего все это нужно?
Для ускорения работы. В первую очередь ускорение поиска. Напомню, соответствие между hashcode ключа и бакетом не хранится, а вычисляется. Математические вычисления — это быстро. Далее, сравнивать объекты по equals() все же придется, но количество этих объектов ограничено.

А недостатки?
Во-первых, потребляемая память. Не все бакеты заполнены списками, на нулевые бакеты тоже тратится место. Во-вторых, при росте таблицы растет и количество элементов в связанных списках. Это замедляет работу. Для оптимизации приходится увеличивать объем массива и заново перераспределять записи по бакетам. Этот процесс называется «рехешинг» (rehashing)

Что такое capacity?
Capacity — размер массива, количество бакетов. Initial capacity — начальный размер массива при создании объекта HashMap. Задается в конструкторе.

Что такое load_factor?
Предельно допустимое отношение заполненных бакетов к общему количеству бакетов, после превышения которого начинается рехешинг. Значение по умолчанию — 0.75. То есть, допустим у Вас массив на 128 ячеек и из них занято 96. load_factor здесь 96/128=0.75. Если при добавлении записи будет занят еще один бакет, запустится процесс рехешинга, будет создан массив большего объема (обычно в 2 раза) и значении load_factor снизится.

У меня пока все. Осталось ответить на несколько вопросов, но это в другом посте.

Про датчик MAP (ДАД)

Про датчик MAP (ДАД)

moct05 » 27 апр 2012, 07:14

1. Для чего вообще этот прибамбас:
ДАД предназначен для преобразования давления во впускном трубопроводе, которое зависит от нагрузки двигателя и частоты вращения коленчатого вала, в электрическое напряжение. При закрытой дроссельной заслонке напряжение сигнала ДАД низкое, а при открытой заслонке – высокое. По мере открытия дроссельной заслонки сигнал ДАД изменяется в противоположном направлении по сравнению с показаниями вакуумметра. ДАД используется также для измерения атмосферного давления при неработающем двигателе, что позволяет ЭБУ адаптировать алгоритмы управления к конкретной высоте над уровнем моря. ЭБУ питает ДАД опорным напряжением 5 В. Изменение давления во впускном трубопроводе вызывает соответствующее изменение электрического сопротивления ДАД и напряжения сигнала. По напряжению сигнала ДАД ЭБУ определяет давление во впускном трубопроводе. При высоком давлении (низком разряжении) ДАД выдает сигнал высокого напряжения и ЭБУ увеличивает подачу топлива в двигатель. При низком давлении (высоком разряжении) напряжение сигнала ДАД уменьшается и ЭБУ снижает подачу топлива.
ДАД используется для измерения атмосферного давления. При включенном зажигании и неработающем двигателе ЭБУ использует сигнал ДАД для корректировки управления составом топливовоздушной смеси (компенсация изменений плотности воздуха, которая зависит от высоты над уровнем моря). Высотная компенсация позволяет снизить неблагоприятное влияние высоты над уровнем моря на уровень выбросов вредных веществ с отработавшими газами и на мощность двигателя. Значение атмосферного давления, хранящееся в памяти ЭБУ периодически обновляется при равномерном движении автомобиля и во время полного открытия дроссельной заслонки.
Отсюда мораль — поехал в горы — для оптимальной работы инжектора глуши машину каждые 500 метров перепада высоты . Поступай таким образом если быстро надвигается циклон/антициклон . Если хорошо приноровиться — то по работе двигателя можно узнать о приближении грозы .

2. Неисправности:
Ну если ему совсем конец (назовем это полный пипец- горит чек, лампа заслонки и ESP, ошибки P0105(6,7,8)) — то тогда все просто — диагностика ЭБУ покажет на него — и только плати денги за замену.
А вот если не полный пипец и MAP просто гонит туфту (простите частоту несоответствующую давлению) то возможны как переливы так и не доливы топлива.
В моем случае: При чистке ДЗ снял ДАД, обнаружил масляную пленку, напшикал жидкостью для карбов, еще и кисточкой пошурудил. . Датчик начал безбожно врать.Внимание не делайте этого, внутри электронная схема, залитая желеобразным герметиком, в крайнем случае спирт и сушка.
Тут правда надо разделить две возможных неисправности:
1. MAP
2. вакуумная течь во впускном коллекторе.
Ну тут уж на любителя : либо датчик снять и проверить, либо врезаться в систему измерителем вакуума и посмотреть соответствие напряжения MAPа давлению.

3.Самостоятельная диагностика и временная замена:
Сразу прошу прощение за то что проверку родного МАР я никак не задокументировал, возможно, когда придет новый, я это сделаю. Объясню все на примере датчика от Газели, двигатель 407. Стоимость 600 р. (Бош-2500), взял за 600. Был удачно инсталлирован и опробован, замечаний нет.

Сам датчик находится между радиатором и коллектором с правой стороны, крепится шурупом под ключ на 7, или торекс. Скажу, нудное это занятие, неудобно очень, ключик у меня маленький, детский какой то. Поэтому родной шуруп был заменен на кровельный саморез с головкой на 8 ключ (есть модный с трещеткой на 8-10 человеческого размера), откусил кончик (укоротил) и теперь все делается проще, под веселую трескотню. Далее разобрал родной датчик и вклеил в него пимку от герметика, плохо но видно на фото.

Потом наш датчик на родное место, для газелевского я лучшего не придумал, ну и бог с ним. Соединил все вакуумным шлангом и хомутами. Все удовольствие встало менее 700 р. Все таки лучше с машиной за такие деньги чем на своих двух, да и работа и все дела там .

Проверка: Цифровым вольтметром, с прикрученными выгнутыми скрепками на щупах, на заглушенном двигателе, проверил массу- черный провод (средний) на фишке датчика к плюсу аккумулятора. Должно быть напряжение аккума (у меня было на 0.1 В. ниже, думаю не критично). Если нет ищем причину.
Далее находим питание, в смысле питающий провод (один из крайних, по моему который без зеленой полоски). При включенном зажигании (но не заведено) вольтметр показывает 5.05 вольт. Если нет ищем причину.
Потом сигнальный провод (методом исключения мы его типа нашли) , при включенном зажигании (но не заведено), напряжение должно быть в диапозоне от 3.2 до 4.8 (из разных источников,если меньше- в топку). На газелевском было 4.8 В. (думаю это равно среднему атмосферному давлению), на родном (на неисправном 4.8 или 2 с копейками вольт, смотря как его потрясти или стукнуть).
Ну и сама процедура проверки в гаражных условиях.
Зажигание включено, двигатель не заведен, щупы на массу и сигнальный провод (через скрепку со стороны проводов).
Подсоединил к датчику вакуумный шланг, далее ротом (вакуумного насоса нет) стал выдувать воздух из него, показания вольтметра почти не меняются.
На глаза попался 2 кубовый шприц, подсоединил его к шлангу, вытянул и напряжение упало до 0.5 . Втянул, поднялось до 5 вольт. На неисправном датчике напряжение не менялось.

Site Map Usability

Site maps can save users from being lost on a crowded site by serving as an alternative method for navigating sites. Well-designed site maps provide a visualization of the site’s hierarchy and groupings, which help people find the information they seek. We present techniques for presenting:

  • Alphabetical site indexes
  • Dynamic diagrams
  • Two-dimensional lists

This 155-page report offers 47 design recommendations for creating effective site maps. Discussions and 87 screenshots supplement the findings.

Topics covered

  • Benefits of a site map
  • Site maps today
  • Behavioral patterns
    • Frequency of use
    • Hunting strategies
    • How participants define site maps
  • Attributes of site maps
    • Poorly rated and low success
    • Highly rated and high success
  • Checklist of 47 guidelines for improving site maps
    • Site map link: Name and placement
    • Navigation
    • Relationship of the site map to the site
    • One column vs. multiple columns
    • Page density
    • Design
    • Content
    • Alphabetical indices
  • User-based diagrams representing their mental models of websites
  • Methodology
  • BMW USA (marketing site for cars)
  • CDNOW (e-commerce)
  • Citysearch Boston (visitor info)
  • Documentum (high-tech product)
  • Harvard Pilgrim (health insurance)
  • Interwoven (high-tech product)
  • iRobot Corporation (high-tech/e-commerce)
  • Marriott (hotels, with online booking)
  • Mercedes Benz USA (marketing site for cars)
  • Museum of Modern Art (non-profit)
  • New Jersey Transit (local transportation)
  • Novell (B2B)
  • Salon (online magazine)
  • Scholastic (children’s books)
  • Siemens Medical Solutions (B2B)
  • Texas Roadhouse (restaurant chain)
  • The Knot (wedding information/e-commerce)
  • TiVo (high-tech product)
  • U.S. Administration on Aging (government)
  • U.S. Treasury Department (government)

What’s new in the 2nd Edition?

The 2nd edition contains additional recommendations, increasing from 28 to 47 guidelines.

Map в C++: что это и как с этим работать

В данном уроке мы разберем еще один часто используемый контейнер STL — map.

Что такое map

Это ассоциативный контейнер, который работает по принципу — [ключ — значение]. Он схож по своему применению с вектором и массивом, но есть некоторые различия:

    Ключом может быть все что угодна. От обычной переменной до класса.

Мы можем создать ключ из любых компонентов и он будет — рабочим.

Поэтому можно с легкостью сделать словарь:

  • Ключом в нашем случае будет — русское слова.
  • А значением — английское.

Добавление, удаление, обращение к элементам происходит за log n. n — в нашем случае размер контейнера.

Как создать map

Сперва понадобится подключить соответствующую библиотеку:

Чтобы создать map нужно воспользоваться данной конструкцией:

  • — этот тип данных будет относиться к значению ключа.
  • — этот тип данных соответственно относится к значению.

При создании map все его элементы будут иметь значение нуля.

Также имеется возможность добавить значения при инициализации (С++ 11 и выше):

С помощью его можно использовать две операции ( it — итератор):

  1. Чтобы обратится к ключу нужно сделать так: it->first .
  2. Чтобы обратится к значению ячейки нужно сделать так: it->second .

Нельзя обращением к ключу ( . ->first ) изменять его значение, а вот изменять таким образом значение ячейки ( . ->second ) легко.

Нельзя использовать никакие арифметические операции над итератором:

Все это будет считаться еще одной ошибкой для компилятора.

Для увеличения или уменьшения можно использовать инкремент или декремент.

Нельзя делать то же самое используя операцию присваивания ( it += 1 ) или вычитания ( it -= 1 ).

Чтобы не писать циклы для увеличения итератора на большие значения, можно воспользоваться функцией advance() :

Она сдвигает указанный итератор вниз или вверх на указанное количество ячеек. В нашем случае он сначала увеличит на 7, а потом уменьшит на 5, в итоге получится сдвиг на две вверх.

Вывод контейнера

Давайте попробуем вывести все элементы, которые находятся в контейнере.

Некоторые функции не могут работать с map из-за его специфической архитектуры.

insert

Это функция вставки нового элемента.

Мы можем сделать то же самое вот так:

count

Возвращает количество элементов с данным ключом. В нашем случае будет возвращать — 1 или 0.

Эта функция больше подходит для multimap, у которого таких значений может быть много.

Нужно помнить, что для строк нужно добавлять кавычки — count(«Good») .

У этой функции основная цель узнать, есть ли определенный ключ в контейнере.

  • Если он есть, то передать итератор на его местоположение.
  • Если его нет, то передать итератор на конец контейнера.

Например, давайте разберем данный код:

erase

Иногда приходится удалять элементы. Для этого у нас есть функция — erase() .

Давайте посмотрим как она работает на примере:

В итоге мы уменьшим количество наших элементов на один.

Также здесь мы воспользовались функцией size() , которая возвращает количество элементов.

Создаем простую игру

Давайте закрепим наши знания на практике — создав примитивную игру.

Пользователю понадобится ввести количество домов на улице и указать для каждого дома сколько людей там проживает.

Далее он может модифицировать данные об улице таким образом:

  • Введя 0 — он сможет узнать имеется ли такой дом и если да, то сколько там живет людей.
  • Введя 1 — сможет удалить ключ из контейнера навсегда.
  • Введя 2 — он сможет добавить новый дом.

Теперь давайте подробно разберем, что тут такое:

  1. В строках 13 — 18: считываем все дома и их жителей.
    • В строке 17: вместо обычного объявления ячейки мы использовали функцию insert .
  2. В строках 24 — 57: здесь находится основной блок и на него стоит обратить внимание.
  3. В строке 26: считываем операцию, которую хочет выполнить пользователь.
  4. В строках 29 — 38: находится код для выполнения операции 0 (вывод элемента).
    • В строке 31: оперируем функцией count, чтобы узнать имеется ли у нас данный элемент.
  5. В строках 39 — 49: находится блок кода для использования операции 1 (удаление).
    • В строке 42: проверяем есть ли этот вообще (даже если его нет, удаление не существующего элемента не приведет к ошибке).
    • Если он есть — удаляем.
  6. В строках 51 — 57: здесь выполнятся код для операции 2 (добавление).

А вот рабочая программа:

Плюсы и минусы: использования map

  • Ключом может быть любая переменная. Это огромный плюс, например если придется делать словарь.
  • Долгое добавление нового элемента.
  • Долгое обращение к элементу.
  • Долгое удаление нового элемента.
  • Также слишком затратный по памяти

Все эти операции происходят за — log n ( n — это размер контейнера).

  1. Если вам требуется быстрый отклик программы, то если возможно оперировать вектором либо массивом лучше использовать именно их.
  2. Если же время не стоит на первом месте, то можно им пренебречь и использовать map.

Упражнение

Создайте программу в которой пользователь сможет использовать данные операции:

  • Добавлять новое слова — [английское — русское].
  • Удалять их.
  • Изменять значение уже существующего слова ( . ->second ).

Если есть вопросы пишите их в комментариях. Удачи в новых начинаниях!

Карты OpenStreetMap: что это такое?

Вторая популярная разновидность называется CycleMap (или OpenCycleMap). Формально она предназначена для велосипедистов. Этой картой можно воспользоваться, переключив кнопочку в правом верхнем углу главной страницы проекта OpenStreetMap. На ней отсутствуют некоторые объекты базовой карты, но зато нанесены горизонтали и хорошо читается рельеф. Вот её внешний вид:

Несмотря на то, что карта OpenCycleMap предлагается на многих ресурсах как один из вариантов для просмотра, у неё есть и свой собственный сайт: http://www.opencyclemap.org. Главное, что меня заинтересовало на этом ресурсе, это возможность переключиться (справа вверху) на разновидность этой карты под названием Landscape, которая отличается несколько большей детализацией по сравнению с исходной.

Из остальных карт я бы отметил карту Hike & Bike. Судя по названию, она предназначена для велопешеходных туристов. На карту нанесено примерно то же, что и на базовую, но цветовое и графическое решение другое. Кроме того, она «весит» гораздо меньше, чем базовая, поэтому загружается быстрее. Выглядит карта вот так:

Круто! Спасибо за информацию. раньше не знала о такой карте. понравилась карта для велосипедистов — будем с весны осваивать маршруты!

Спасибо тебе за отзыв! Как ты, наверное, поняла, эта статья — первая из цикла статей о картах и программах для них. Я сейчас эту карту юзаю и на компе в онлайне, и на планшете в оффлайне, буду всё это описывать.

а я вот как раз плохо разбираюсь в картах (ну разве что в Яндекс-картах освоилась), так что буду читать и учиться;)

А я ленивый :))) Поэтому выбрал такие сервисы, с которыми работать очень просто.

У меня пока путаницу вызывают типы карты, которые в разных сервисах по-разному называются. На том же skobbler другие названия, понятен только cycle 🙂

Олег, можно просто поклацать по разным типам карты и выбрать понравившийся. Что касается Skobbler, то там всего 4 варианта: базовый (там он называется «OSM»), уже упомянутый тобой Cycle Map, а также парочка других, на мой взгляд, менее полезных вариантов (skobbler и MQ Open). Проект-то открытый, поэтому любой сервис делает с этими картами всё, что хочет. Но немного логики в сочетании с просмотром разных вариантов карты помогут разобраться с тем, «кто есть кто».

У OSM очень важным является то, что если дорога там есть, то значит кто-то там проехал или эта дорога видна из космоса. Нарисовать что-то просто так не выйдет. Жаль нет подписей, кто этот трек загрузил и сколько он там «рубился» (приминительно к авто-туризму), а то от этого сильно зависит проходимость этого трека в то или иное время года 😀

nord_tramper, спасибо за полезное дополнение. Кстати, не только в автотуризме, но и в пешеходном туризме возможны косяки, когда человек рубился напролом через заросли, а потом решил выложить свой трек как якобы тропу. К счастью, такое бывает редко. Ну и здравый смысл тоже никто не отменял. Плюс сбор всевозможной информации перед походом: чужие описания, фотографии, путеводители, разнообразные карты, не только OSM, но и топографические, а также снимки из космоса.

Не знала, что есть такой сервис карт. Буду осваивать. Мне всегда нравились карты на бумаге в интернете мне не много сложнее разбираться.

Валентина, осваивайте! Я в скором времени начну писать о прокладке маршрута при помощи этих сервисов. А это гораздо удобнее, чем линеечкой по карте мерять. Можете ещё скачать себе программу SAS Планета, она работает с кучей онлайн-карт (OpenStreetMap, Гугл, Яндекс, топографические карты и т.д.), позволяет проводить по ним измерения, прокладывать маршруты, а также сохранять карты на свой компьютер и конвертировать их в различные форматы (для навигаторов, айфонов, мобильных устройств на Андроиде и т.д.).

Привет! А как мне самому нанести на карту ОСМ какую-нибудь тропу, по которой я часто хожу в лесу, но её на карте нет?

Георгий, вам нужно сначала зарегистрироваться у них на сайте (или войти с помощью аккаунта Google, Facebook или другого). Затем нажимаете кнопку «Правка» (слева вверху). Стрелочка раскрывает три варианта. Советую для начала попробовать самый первый в списке: «Редактировать с помощью iD (редактор в браузере)». И можно приступать к редактированию и нанесению нужных вам объектов. Я уже давно не редактировал, детали подзабыл, но у них там имеются хорошие справочные материалы, где рассказывается, как это делается.

После ввода текста выберите подпись комментария. Например, вариант «Анонимный». Или введите своё имя, выбрав пункт «Имя/URL» (поле «URL» заполнять не обязательно). Или выберите для подписи аккаунт Google, тогда вы сможете получать на почту уведомления о новых комментариях: в правом нижнем углу формы комментирования поставьте галку в пункте «Оповещать».