Тест «Дом-дерево-человек»
Дж. Бук в 1948 году предложил интересную методику теста «Дом-дерево-человек», которая до сих пор не знает равных по популярности. Она годится и для взрослых, и для детей. Рассказать о ней подробно решили и мы.
Психологический тест «Дом-дерево-человек»
При этом суть рисуночного теста «Дом-дерево-человек» очень проста: исследуемому дают бумагу и предлагают нарисовать три обозначенных объекта в одной сцене, обозначив их взаимодействие — дом, человек и дерево.
Возьмите лист бумаги, сядьте поудобнее и нарисуйте дом, дерево и человека. Тест пройден, осталось его интерпретировать! Картинка – это метафора, отражающая вашу жизнь.
Расшифровка теста «Дом-дерево-человек»
Анализ теста «Дом-дерево-человек» — дело долгое и хлопотное, но стоит вам уловить суть, и вы все легко поймете. Для начала обратите внимание, в каком порядке были нарисованы объекты? Если сначала – дерево, то человеку важная жизненная энергия. Если дом – то безопасность и успех, а если человек – то удовлетворение потребностей. Итак, рассмотрим тест «Дом-дерево-человек» и его интерпретацию более детально.
Дом
Обратите внимание на дом – это отношение к себе. Если он крупный и красивый, то человек себя любит, а если вдали — то чувствует себя брошенным. Если вместо дома – вид сверху, проекция, то у человека большие проблемы.
Если дом закрыт, нет окон или дверей – замкнутость, неприступность. Ступеньки, идущие не к двери, а к глухой стене – конфликтная ситуация.
Если дом не имеет нижней черты, идет снизу – у человека слабый контакт с реальностью, если же эта линия слишком яркая – трудности и тревога. Если боковые контуры тонкие – чувство опасности. Если изображена одномерная перспектива, до и та – боковая, человек отчужден от окружающих.
Если нет дверей – человек замкнут. Если они сбоку – он отступает или отрешен. А если двери открыты – признак откровенности, стремление к теплу извне. Если двери слишком большие – зависимость от окружающих, а если маленькие – замкнутость (как и при наличии крупного замка).
Если из трубы валит густой дым – внутренняя неприступность, тонкий – недостаток эмоционального тепла. Открытые окна говорят о прямолинейности, готовности к контактам, закрытые – о том, что человек тяготится общением. Чем ярче крыша, тем сильнее человек зависит от фантазий.
Человек
Результаты теста «Дом-дерево-человек-дерево» определяются мельчайшими деталями. Например, обратите внимание на голову. Если она большая – подчеркивается интеллект, маленькая — его отсутствие, нечеткая – застенчивость, рисуется в последнюю очередь – конфликты. При этом длинная шея говорит о самоконтроле, а короткая – об импульсивности. Чем больше подчеркнута одна черта лица, тем сильнее важен этот канал восприятия для человека, а если подчеркнут подбородок – это стремление доминировать.
Отсутствие ушей – игнорирование критики. Если глаза маленькие – погруженность в себя, большие – грубость, крупные ресницы – кокетливость. Если волосы заштрихованы – тревожность, нет – враждебность.
Крупные плечи говорят о тяге к власти, мелкие – об ощущении собственной малой значимости. Чем более угловатое тело – тем более мужественен человек. Слишком маленькое тело – униженность, крупное – неудовлетворенные потребности.
Чем лучше прорисованы конечности, тем тверже человек стоит на земле и больше готов к действию.
Если на картинке видны корни, значит человек излишне любопытен, если они обозначены чертой – наличие секретов. Если крона круглая – эмоциональность, если ветви опущены – отказ от усилий, в разные стороны – поиск контактов, распыление. Если все ветви нарисованы одной линией – избегание реальности. Пальма говорит о стремлении к переменам, плакучая ива – о недостатке энергии. Если ствол нарисован тонкими линиями, а крона толстыми – желание самоутверждаться и свободно действовать. Если же линии равномерные, с нажимом – решительность и продуктивность.
Статьи по теме:
Тест Ряховского Каждого из нас во все времена волновало то, как о нашей персоне отзываются окружающие. |
Карта интересов Голомштока У каждого человека еще со школьных лет есть любимые и нелюбимые предметы. Это может быть как математика так и физическая культура. Но мало кто знает что такое деление на любимое и не очень может сыграть большую роль в жизни. Даже если вы давно уже не школьник. Какую именно мы расскажем в следующей методике. |
Тест на распущенность Скромность и целомудрие большинства современных барышень, к сожалению, оставляет желать лучшего. Как показывает статистика, почти каждая вторая из нас склонна к некой доле распущенности. Можно ли посчитать, насколько вам присуща эта черта и как далеко вы можете зайти за грань дозволенного? Давайте попробуем это выяснить с помощью теста. | Тест на силу воли Все мы знаем шутку, про то когда по отдельности есть сила и воля, а сила воли как таковая отсутствует. Многие жалуются на то, что именно этой черты характера им зачастую не хватает в жизни. Проверить наличие этого качества можно с помощью теста на силу воли. |
Тест: Дом Дерево Человек — методика
Методика Дом Дерево Человек тест использующий проективные методики исследования личности.
Этот тест известен многим, но не многие знают, что он несет огромное знание тем, кто знаком с расширенной интерпретацией символов и образов. Он может применяться для тестирования взрослых, может быть использован при приеме на работу или при принятии решения о повышении сотрудников.
Попросите тестируемого как можно тщательнее и аккуратнее нарисовать дом, дерево и человека.
Выбор предметов для рисования вы можете обосновать тем, что они знакомы каждому, наиболее удобны как объекты для рисования и, наконец, стимулируют более свободные словесные высказывания, нежели другие объекты. Объясните ему, что он может нарисовать любой дом, любое дерево и человека. Он все решаете самостоятельно.
Тестируемый можете пользоваться стирательной резинкой, сколько захочется, может думать над каждым элементом сколько угодно времени. Главное нарисовать рисунок который ему понравится.
Если тестируемый отказывается, ссылаясь на то, что он не художник, вам нужно объяснить что вы не будете оценивать художественность, вам важно просто посмотреть на рисунок, который получится. Рисунок должен быть выполнен от руки без использования линеек и других вспомогательных предметов.
После окончания рисования необходимо провести детальный опрос.
Необходимо понимать, что рисунки выполняемые человеком — это автопортрет, каждая деталь которого имеет ОГРОМНОЕ значение при интерпретации. “Расшифровка” рисунков даст возможность сделать вывод о предпочтениях личности, уровне развития, основных мотиваторах.
Фиксация процесса
Пока испытуемый рисует дом, дерево и человека, вы должны фиксировать и записывать следующее:
- паузы
- общее время
- длительность рисования отдельных деталей
- последовательность рисунков
- последовательность деталей на отдельных рисунках
- комментарии и высказывания тестируемого, желательно дословно
- обращайте внимание на эмоции, которые вызывает рисование отдельных частей теста
Будет лучше, если вы сядете слева от правши и справа от левши.
Методика опроса после теста
После того, как рисунки завершены, попросите охарактеризовать, описать и рассказать об объектах и то, что их окружает, а также высказать связанные с ними ассоциации.
Бланк опроса
ЧЕЛОВЕК
1 | Это мужчина или женщина (мальчик или девочка)? |
2 | Сколько ему (ей) лет? |
3 | Кто он? |
4 | Это ваш родственник, друг или кто-нибудь другой? |
5 | О ком вы думали, когда рисовали? |
6 | Что он делает? (и где он в это время находится?) |
7 | О чем он думает? |
8 | Что он чувствует? |
9 | О чем вас заставляет думать нарисованный человек? |
10 | Кого вам напоминает этот человек? |
11 | Этот человек здоров? |
12 | Что именно на рисунке производит на вас такое впечатление? |
13 | Этот человек счастлив? |
14 | Что именно на рисунке производит на вас такое впечатление? |
15 | Что вы чувствуете по отношению к этому человеку? |
16 | Считаете ли вы, что это характерно для большинства людей? Почему? |
17 | Какая на ваш взгляд погода на рисунке? |
18 | Кого напоминает вам этот человек? Почему? |
19 | Чего больше всего хочет человек? Почему? |
20 | Как одет этот человек? |
ДЕРЕВО
1 | Что это за дерево? |
2 | Где в действительности находится это дерево? |
3 | Каков приблизительный возраст этого дерева? |
4 | Это дерево живое? |
5 | (Если испытуемый считает, что дерево живое) |
6 | Что именно на рисунке подтверждает, что дерево живое? |
7 | Нет ли у дерева какой-то мертвой части? Если есть, то какая именно? |
8 | Чем, по вашему мнению, вызвана гибель дерева? |
9 | Как вы думаете, когда это произошло? |
10 | (Если испытуемый считает, что дерево мертвое) |
11 | Чем, по вашему мнению, вызвана гибель дерева? |
12 | Как вы думаете, когда это произошло? |
13 | Как вы думаете, на кого это дерево больше похоже на мужчину или на женщину? |
14 | Что именно в рисунке подтверждает вашу точку зрения? |
15 | Если бы здесь вместо дерева был человек, в какую сторону он бы смотрел? |
16 | Это дерево стоит отдельно или в группе деревьев? |
17 | Когда вы смотрите на рисунок дерева, как вам кажется, оно расположено выше вас, ниже вас или находится на одном уровне с вами? |
18 | Как вы думаете, какая погода на этом рисунке? |
19 | Есть ли на рисунке ветер? |
20 | Покажите мне, в каком направлении дует ветер? |
21 | Расскажите подобнее, что это за ветер? |
22 | Если бы на этом рисунке вы нарисовали солнце, где бы оно располагалось? |
23 | Как вы считаете, солнце находится на севере, востоке, юге или западе? |
24 | О чем заставляет вас думать это дерево? |
25 | О чем оно вам напоминает? |
26 | Это дерево здоровое? |
27 | Что именно на рисунке производит на вас такое впечатление? |
28 | Это дерево сильное? |
29 | Что именно на рисунке производит на вас такое впечатление? |
30 | Кого вам напоминает это дерево? Почему? |
31 | В чем больше всего нуждается это дерево? Почему? |
32 | Если бы вместо птицы (у кого дерева или у какого объекта на рисунке, не имеющего отношения к основному дереву), был человек, то кто бы это мог быть? |
ДОМ
1 | Сколько этажей у этого дома? |
2 | Этот дом кирпичный, деревянный или еще какой-нибудь? |
3 | Это ваш дом? (если нет, то чей он?) |
4 | Когда вы рисовали этот дом, кого вы представляли себе в качестве его хозяина? |
5 | Вам бы хотелось, чтобы этот дом был вашим? Почему? |
6 | Если бы этот дом был вашим и вы бы могли распоряжаться им, так как вам хочется: |
7 | Какую комнату вы бы выбрали для себя? Почему? |
8 | С кем бы вы хотели жить в этом доме? Почему? |
9 | Когда вы смотрите на рисунок дома, он вам кажется расположенным близко или далеко? |
10 | Когда вы смотрите на рисунок дома, вам -кажется, что он расположен выше вас, ниже вас или примерно на одном уровне с вами? |
11 | О чем вас заставляет думать этот дом? |
12 | О чем он вам напоминает? |
13 | Этот дом приветливый, дружелюбный? |
14 | Что именно на рисунке производит на вас такое впечатление? |
15 | Считаете ли вы, что эти качества свойственны большинству домов? Почему? |
16 | Какая, по вашему мнению, погода на этом рисунке? |
17 | О ком вас заставляет думать этот дом? Почему? |
18 | В чем больше всего нуждается этот дом? Почему? |
19 | Куда ведет этот дымоход? |
20 | Куда ведет эта дорожка? |
21 | Если бы вместо дерева (куста, ветряной мельницы или любого другого объекта на рисунке, не имеющего отношения к самому дому) был человек, то кто бы это мог быть? |
Вы должны учесть, что процесс рисования дома, дерева и человека часто пробуждает сильные эмоциональные реакции. Вы можете столкнуться с ухудшением настроения, слезами, или, наоборот, с явной активностью и повышенной возбудимостью.
СКАЧАТЬ: Интерпретация символов и образов теста Дом Дерево Человек
Научитесь расшифровывать детские рисунки
Научитесь расшифровывать детские рисунки и лучше познайте своего ребенка и его внутренний мир. Детские рисунки могут так много рассказать вам об их страхах, радостях, мечтах, надеждах и кошмарах, но они также дают вам ценное представление об их личностях .
Дети начинают рисовать с того момента, когда они становятся достаточно большими, чтобы держать мелок или карандаш и прикладывать их к бумаге. Для самых маленьких рисование представляет собой естественную деятельность , обычно с большим удовольствием. Рисуют, чтобы выразить эмоции, потому что не умеют выражать словами разные чувства. Они выражают свои страхи, радости, мечты, надежды и кошмары с помощью рисунков, а также рассказывают вам о своих отношениях с миром и другими вещами .
Рисование – это способ общения, а детские рисунки представляют взгляд на их личности . Детские рисунки уникальны и могут дать нам точную информацию о юных художниках.
Каждый родитель надеется найти смысл в рисунках своего ребенка . Иногда рисунки — это просто рисунки, и на странице не видно ничего, кроме — забавного игрового времени . Но иногда интерпретация детских рисунков означает, что вы обнаруживаете более глубокий слой того, что они думают и чувствуют.
Итак, не вчитывайтесь в рисунок слишком много, вместо этого позвольте ребенку рассказать вам, что этот рисунок значит для него . Задавая вопросы, например о том, что делают люди на рисунке, вы можете узнать у ребенка то, чего вы никогда не увидите сами.
Этапы рисования
Существует три этапа детского рисунка : этапы каракулей, предварительная схема и схематический этап.
- Писание (2-4 года)
На данном этапе в картинках нет реалистичности, и в основном это просто пометки на странице. Казалось бы, ничего там нет, но иногда дети создают нечто, называемое «случайным реализмом». Это означает, что когда каракули будут готовы, вы сможете увидеть определенные фигуры, напоминающие машину или дом.
- Предварительная схема (4-7 лет)
На этом этапе дети пытаются создавать предметы, которые видят своими глазами. Они могут рисовать самые простые вещи, такие как лица, фигурки, автомобили, грузовики, деревья и дома. В этих рисунках обычно нет реалистичных деталей. В конце этапа они начинают добавлять определенные вещи, которые выделяют их идеи, например, цветы перед домом или одежду на фигурках из палочек.
- Схема (7+ лет)
На этом этапе есть некоторые признаки схемы. Например, рисунок океана может включать чаек, морскую звезду, пляжный мяч, людей в купальных костюмах и т. д. Можно добавить слова и символы, чтобы дать дополнительные сообщения, объясняющие рисунок. Рисунки людей будут иметь больше деталей, возможно, включая веснушки. Здесь больше глубины и реализма, возможно использование новых точек зрения.
Пол и цветовые предпочтения
Неудивительно, что есть некоторые различия между тем, как и что рисуют девочки и мальчики . Девочки обычно рисуют округлые формы, в том числе цветы, сердечки, в то время как углы, квадраты и более прямые линии характерны для мальчиков, наряду с автомобилями, автобусами и т. д. собственный пол.
Кроме того, некоторые исследователи сообщают, что девочек, как правило, используют больше цветов в одном рисунке, чем мальчики, с предпочтением более теплых цветов (например, розового), а мальчики демонстрируют предпочтение более холодных цветов (например, синего).
Очевидно, что выбор цвета может иметь большое значение:
- Черный и фиолетовый предполагает доминирование, и ему может отдать предпочтение относительно требовательный ребенок. Синий нравится детям, которые заботливы и любят компанию.
- Красный — цвет волнения, особенно его могут использовать дети, чтобы ничего не пропустить, и это один из самых популярных цветов для детей.
- Розовый показывает потребность в любви и признательности и нравится девушкам
- Зеленый — цвет тех, кто любит быть разным, любит космос, артистичен и интеллигентен.
- Желтый также демонстрирует ум и солнечный характер.
Положение рисунка на странице
Когда дело доходит до позиционирования на странице, очевидно левая сторона страницы традиционно ассоциируется с прошлым и воспитанием . Это также связано с матерями.
Правая сторона связана с интересом к будущему и потребностью в общении . Эта сторона связана с отцами.
Ребенок, который размещает рисунок хорошего размера на видном месте на странице, считается уравновешенным и безопасным , в то время как маленькие фигуры, нарисованные у нижнего края бумаги или рядом с ним, или в угол , выражают чувство неполноценности или незащищенности.
Какие эмоции раскрывают их рисунки?
Многие эмоции могут быть раскрыты в рисунках вашего ребенка, но не слишком увлекайтесь тем, что они могут означать, пока ваш ребенок не успеет объяснить их вам . Тем не менее, исследователи обнаружили некоторые моменты, которые могут отображать то, что на самом деле чувствует ребенок.
- Детальные, тщательные рисунки могут выявить ребенка, который чувствует потребность очень стараться.
- Смелые штрихи , особенно если они расположены близко друг к другу, может быть признаком стресса, сильных чувств, решимости или гнева , а более мягкие штрихи предполагают более мягкий характер.
- Качество линии также может иметь значение – фигура, нарисованная светлыми, колеблющимися, прерывистыми линиями, показывает нерешительного, неуверенного в себе ребенка, который, кажется, думает по ходу дела. Напротив, смелая, непрерывная, свободно проведенная линия выражает уверенность в себе и чувство безопасности.
При рисовании фигур размер и относительный размер нарисованных фигур считаются значимыми , причем более важные или доминирующие фигуры рисуются крупнее.
Отсутствие рук иногда интерпретируется как указание на робость, признак неагрессивных детей, тогда как преувеличение размера рук рассматривается как символ агрессивных тенденций, если фигура является автопортретом. Точно так же крошечные ступни считаются признаком неуверенности — буквально неустойчивой опоры.
- Импульсивный ребенок : Большие фигуры, отсутствие шеи и асимметрия конечностей.
- Тревожный ребенок : Облака, дождь, летящие птицы, нет глаз на фигурках
- Застенчивый ребенок : Низкие фигуры, без носа и рта, маленькие фигурки и руки близко к телу
- Злой ребенок : Большие руки и зубы, длинные руки, косоглазие
- Неуверенный в себе ребенок : Чудовищные фигуры, крошечные головы, отсутствие рук и наклонные фигуры
Как поощрять рисование ваших детей
Обучение интерпретации и расшифровке детских рисунков может быть очень полезным для вас как родителя. Однако старайтесь поощрять и эту творческую активность.
Художественный опыт помогает детям развивать независимость в определенных пределах и дает им возможность представлять свои идеи на бумаге или в других форматах . Самое главное, творческое самовыражение позволяет детям использовать волшебство собственного воображения, а это и есть то, что нужно ребенку.
Вот несколько вещей, которые вы можете сделать, чтобы побудить вашего ребенка больше рисовать:
- Сделайте рисование постоянной частью игрового времени . Предложите им различные принадлежности для рисования, такие как мелки, толстые карандаши и смываемые маркеры. Разрежьте бумажные пакеты, чтобы на них можно было рисовать. Иногда маленьким детям помогает, если вы приклеиваете бумагу к столу, чтобы она не двигалась, когда они рисуют.
- Инструкции не требуются. Позвольте вашему ребенку экспериментировать, исследовать и выражать свои творческие способности по-своему.
Этот независимый ребенок должен чувствовать себя уверенным, компетентным и умным.
- Обратите внимание на процесс, а не только на продукт . Участвуйте в процессе рисования, а не просто хвалите ребенка за успехи. Помогите ему нарисовать что-нибудь посложнее или подберите вместе подходящие цвета для домика из дерева.
- Используйте искусство, чтобы помочь ребенку выразить сильные чувства . Если ваш ребенок злится, помогите ему/ей выразить эти эмоции, нарисовав очень злую картинку.
- Продемонстрируйте рисование и письмо вашего ребенка . Так ваш ребенок узнает, что его работа ценна и важна.
Любите рисовать с детьми? Не могли бы вы поделиться с нами рисунками своих детей? Это было бы замечательно!
Кодирование Хаффмана
Описание в основном взято у профессора Виджая Рагунатана. В
это задание, вы будете использовать свои знания об приоритетных очередях, стеках,
и деревья для разработки программы сжатия файлов и программы распаковки файлов
(похожий
застегивать
и распаковать). Вы будете основывать свои утилиты на широко используемом алгоритмическом методе
Кодирование Хаффмана, которое используется при сжатии JPEG, а также в аудио MP3.
сжатие.
Кодировка ASCII
Многие языки программирования используют ASCII (что означает американский стандартный код для обмена информацией) кодирование для представления символов. В кодировке ASCII каждый символ кодируется (представлено) с тем же количеством битов (8 бит) на символ. С тех пор 256 различных значений, которые могут быть представлены 8-битами, существует потенциально 256 различных символов в наборе символов ASCII, как показано на таблица символов ASCII доступна на http://www.asciitable.com/.
Теперь рассмотрим простой пример кодирования символов ASCII. Используя кодировку ASCII (8 бит на символ), 13-символьный строка «вперед, суслики» требуется 13 * 8 = 104 бита. В таблице ниже показано, как работает кодирование.
Символ | ASCII код | 8 бит двоичное значение |
Космос | 32 | 00100000 |
и | 101 | 01100101 |
г | 103 | 01100111 |
ч | 104 | 01101000 |
или | 111 | 01101111 |
р | 112 | 01110000 |
р | 114 | 01110010 |
с | 115 | 01110011 |
Данная строка будет быть записан в виде следующего потока битов (пробелы будут не пишется, только 0 и 1)
01100111 01101111 00100000 01100111 01101111 00100000 01100111 01101111 01110000 01101000 01100101 01110010 01110011
Обратите внимание, что мы предполагаем, что для
каждого байта, у нас самый старший бит слева, а
младший значащий бит справа для этого PE/PA. Это не совсем
значение, за исключением того, что программы сжатия и распаковки должны следовать
такой же порядок битов.
От Кодирование ASCII к кодированию Хаффмана
Далее, давайте посмотрим, как мы могли бы использовать меньше битов, используя более простую схему кодирования. Поскольку существует всего 8 различных персонажи в «гоу-гоу суслики», можно использовать только 3 бита для кодирования 8 различных символов. Мы можно, например, использовать кодировку, показанную в таблице ниже (имейте в виду, что возможны и другие 3-битные кодировки).
Символ | Код Значение | 3-битный двоичное значение |
г | 0 | 000 |
или | 1 | 001 |
р | 2 | 010 |
ч | 3 | 011 |
и | 4 | 100 |
р | 5 | 101 |
с | 6 | 110 |
Космос | 7 | 111 |
Теперь будет закодирована строка «вперед, суслики». как: 000 001 111 000 001 111 000 001
010 011 100 101 110. Как видите, используя три бита на
вместо восьми битов на символ, которые использует ASCII, строка
«иди, суслики» использует всего
из 39бит вместо 104 бит.
Однако даже в этом улучшенном
схема кодирования, мы использовали одинаковое количество битов для представления каждого символа,
независимо от того, как часто символ появляется в нашей строке. Еще больше бит
можно сэкономить, если использовать менее трех битов для кодирования таких символов, как g, o,
и пространство, которые происходят часто и
более трех бит для кодирования таких символов, как e, h, p, r и s, которые встречаются реже
часто в «гоу-гоферс». Это основная идея Хаффмана.
кодирование: использовать меньше битов для символов, которые встречаются чаще . Хорошо
посмотрите, как это делается с помощью древовидной структуры данных, в которой символы хранятся как
его листовые узлы, и чьи пути от корня к листу обеспечивают битовую последовательность, используемую для
кодировать символы.
На пути к дереву кодирования
Использование бинарного дерева для кодирование, все символы хранятся в листьях дерева. Левое ребро пронумеровано 0, а правое ребро пронумеровано 1. Код для любой узел символа/листа получается путем следования пути от корня к листу и объединение 0 и 1 с. Конкретная структура дерева определяет кодирование любого листового узла с использованием ребра 0/1 описана конвенция. Как например, дерево ниже справа дает кодировку, показанную слева.
|
Используя эту кодировку, кодируется «вперед, суслики» (опять же,
пробелы не будут появляться в битовом потоке) как: 00 01 101 00 01 101 00 01 1110 1101 1100 1111 100. Это
всего 37 бит, что на два бита меньше, чем в улучшенном кодировании, в котором каждый
из 8 символов имеет 3-битную кодировку! Биты сохраняются кодированием
часто встречающиеся символы, такие как ‘g’ и ‘o’ с меньшим количеством битов (здесь два
биты), чем символы, которые встречаются реже, такие как «p», «h», «e» и
‘р’.
Чтобы декодировать данный поток, который был закодирован данным деревом, начните с корня дерева и следуйте левая ветвь, если следующий бит в потоке равен 0, и правая ветвь, если следующий бит в потоке равен 1. Когда вы дойдете до листа, напишите символ сохраняется на листе и снова начинается с вершины дерева. Битовый поток 10011101101110011111100 дает вправо-влево-влево на букву ‘s’, затем (начиная снова с корня) с вправо-вправо-вправо-влево в буква «p», за которой следует вправо-вправо-влево-вправо до буквы «h». Продолжая таким образом, мы получим декодированную строку «сфера».
Коды префиксов
Когда все символы хранятся в листьях, и каждый интерьер
(нелистовой) узел имеет двух дочерних элементов, кодирование основано на соглашении 0/1. изложенное выше, удовлетворяет очень важному свойству, называемому префиксом .
свойство , в котором говорится, что ни одна битовая последовательность символов не является
префикс кодирования битовой последовательности любого другого символа. Это делает это
можно декодировать битовый поток с помощью дерева кодирования, следуя от корня к листу
пути. Дерево, показанное выше для «go gophers», удовлетворяет этому префиксу.
свойство и является оптимальным деревом.
Есть и другие деревья, использующие 37 бит; например, вы можете просто поменять местами любой
одноуровневые узлы и получить другую кодировку, использующую то же количество битов. Следующий,
рассмотрим алгоритм построения такого оптимального дерева. Этот алгоритм
называется кодированием Хаффмана и было изобретено Дэвидом А. Хаффманом в 1952 когда он
был доктором философии. студент Массачусетского технологического института.
Кодирование Хаффмана
В предыдущем разделе мы видели примеры того, как поток битов может
генерироваться из кодировки. Мы также видели, как дерево можно использовать для декодирования
поток битов. Мы обсудим, как построить дерево здесь, используя алгоритм Хаффмана.
алгоритм.
Предположим, что каждому символу соответствует вес, который
равно количеству раз, которое символ встречается в файле. Например, в
строка «go gophers», символы ‘g’ и ‘o’ имеют
вес 3, пробел имеет вес 2, а остальные символы имеют вес 1. Когда
сжимая файл, нам нужно сначала прочитать файл и вычислить эти
веса. Предположим, что все веса символов рассчитаны. Хаффмана
Алгоритм предполагает, что мы строим одно дерево из группы (или леса)
деревья. Изначально все деревья имеют один узел, содержащий символ и
вес персонажа. Итеративно новое дерево формируется путем выбора двух деревьев
и создание нового дерева, дочерние узлы которого являются корнями двух деревьев.
вес нового дерева равен сумме весов двух поддеревьев.
Это уменьшает количество деревьев на одно в каждой итерации. Процесс
повторяется до тех пор, пока не останется только одно дерево. Алгоритм следующий:
- Начните с леса деревьев. Все деревья имеют только один узел, с вес дерева равен весу символа в узле. Наиболее часто встречающиеся символы имеют наибольший вес. Персонажи встречающиеся реже всего, имеют наименьший вес.
- Повторяйте этот шаг, пока не останется только одно дерево:
Выберите два дерева с наименьшие веса; назовите эти деревья T 1 и T 2 . Создать новое дерево, корень которого имеет вес, равный сумме весов T 1 + T 2 и чье левое поддерево T 1 и чье правое поддерево T 2 .
- Единственное дерево, оставшееся после предыдущего шага, является оптимальным дерево кодирования.
В качестве примера мы будем использовать строку «вперед, суслики». Изначально
у нас есть лес, показанный ниже. Узлы показаны с весом, который
представляет количество раз, когда символ узла встречается в данном вводе
строка/файл.
Мы выбираем два минимальных узла. Имеется пять узлов с минимальным
вес 1. В этой реализации мы поддерживаем приоритетную очередь с
предметы, расположенные в соответствии с их весом. Когда два предмета имеют одинаковые
веса, конечный узел (т. е. узел, связанный с символом ASCII)
всегда заказывала сначала. Если оба узла являются листовыми узлами, они упорядочены в соответствии с
к их кодировке ASCII. Если оба узла не являются листовыми узлами, они
упорядочены в соответствии со временем создания узлов. Мы всегда выбираем
первые два элемента в очереди приоритетов, а именно узлы для символов
‘е’ и
‘час’.
Мы создаем новое дерево, корень которого взвешивается суммой
выбраны веса. Порядок узлов в очереди приоритетов также определяет
левый и правый дочерние узлы нового корня. Теперь у нас есть лес из семи деревьев, как показано здесь. Хотя вновь созданный узел имеет тот же
вес как пробел, заказывается после
Пробел в приоритетной очереди, потому что
Пробел — это символ ASCII.
Выбор первых двух (минимальных) узлов в очереди приоритетов дает другой дерево с весом 2 как показано ниже. Сейчас в лесу деревьев шесть деревьев, которые в конечном итоге построить дерево кодирования.
Снова мы должны выбрать первые два (минимальных) узла в очереди приоритетов. Нижайший weight — это e-узел/дерево с весом, равным 1. Есть три дерева с весом 2; выбранный соответствует символу ASCII, потому что того, как мы упорядочиваем узлы в очереди приоритетов. Новое дерево имеет вес 3 и будет помещено последним в приоритетная очередь в соответствии с нашей стратегией заказа.
Теперь есть два дерева с весом, равным 2. Они соединены в новое дерево, вес которого равен 4. Осталось четыре дерева, одно из которых вес 4 и три с весом 3.
Первые два минимальных (вес 3) дерева в очереди приоритетов
присоединился к дереву, вес которого
равно 6. Осталось три дерева.
Минимальные деревья имеют веса 3 и 4; они объединены в дерево весом 7.
Наконец, два последних дерева объединяются в окончательное дерево, вес которого равно 13, сумме двух весов 6 и 7. Это дерево дерево, которое мы использовали для иллюстрации кода Хаффмана выше. Обратите внимание, что вы можете легко придумать альтернативное оптимальное дерево, используя другой Стратегия упорядочивания для упорядочивания деревьев одинакового веса. В этом случае битовые комбинации для каждого символа различны, но общее количество битов, используемых для кодировать «гоу-гоферс» то же самое.
Теперь покажем другое дерево сжимать струну «улицы каменные звезды не являются» оптимально. Кодировать «улицы» у нас было бы следующее биты: 1110001111011000111101010011110.
Другое дерево/стол Хаффмана Пример | |||||||||||||||||||
|
Важно отметить
что вы не можете использовать дерево, построенное для строки
«иди, суслики» на
декодировать битовые потоки, полученные в результате кодирования
«улицы каменные, звезд нет», так как кодирование выполняется с использованием другого дерева.
Реализация/программирование кода Хаффмана
В этом разделе мы рассмотрим основные этапы программирования при реализации Кодирование Хаффмана. Реализация состоит из двух частей: программа сжатия и программа декомпрессии. Будем считать, что это отдельные программы, но на самом деле их много. общие функции. Для этого набора упражнений/задания по программированию вы занимаются в основном декомпрессией. Однако, чтобы сделать декомпрессию, мы должны понять сжатие.
Программа сжатия
Для сжатия файла (последовательности символов) вам нужна таблица битов кодировки, то есть таблица, содержащая последовательность битов, используемых для кодирования каждого символа. Эта таблица построена из дерева кодирования с использованием путей от корня к конечному узлу. генерировать битовую последовательность, которая кодирует каждый символ.
Сжатый файл получается с помощью следующих шагов верхнего уровня. Эти шаги будут
развиваться дальше в подэтапы, и вы в конечном итоге реализуете программу
на основе этих идей и подшагов.
1. Постройте дерево кодирования Хаффмана на основе количества появления каждого символа ASCII в файле. Построить таблицу Хаффмана коды для всех символов ASCII, которые появляются в файле.
2. Прочитайте файл, который нужно сжать (обычный файл) и обрабатывать по одному символу за раз. Для обработки каждого символа найдите бит последовательность, которая кодирует символ, используя таблицу, построенную на предыдущем шаге и запишите эту битовую последовательность в сжатый файл.
Основная проблема здесь заключается в том, что при кодировании символа ASCII при чтении из файла код обычно короче 8 бит. Однако, большинство систем позволяют записывать в файл по байту или 8 битам за раз. Это становится Вам необходимо накопить коды для нескольких символов ASCII перед записью 8-битного символа в выходной файл.
Чтобы сжать строку
«улицы-каменные звезды-не звезды», например, мы читаем из строки по одному символу за раз. Код для ‘s’
111, мы не можем записать в файл
еще. Читаем следующий символ
‘t’, чей код
00. Опять не можем написать
выходной файл, потому что общее количество битов всего 5.
Теперь мы читаем следующий символ ‘r’,
чей код 011. Сжатие
программа теперь может печатать символ битового шаблона
11100011 в выходной файл.
Еще раз напомним, что мы используем порядок битов в байте, равный единице. где старший бит слева, а младший бит находится справа.
Продолжая процесс, программа должна будет прочитать
‘eet’, комбинированный код которого
«11011000», перед печатью
8-битный комбинированный код в выходной файл. Когда программа
читает следующие три символа
‘a’, комбинированный код
«111101010». Как комбинированный код
имеет на один более 8 бит, программа должна вывести первые 8 бит в
выходной файл и объединить оставшийся бит со следующими символами.
Вы также можете столкнуться с кодами, длина которых превышает 8 бит. Вы должны были бы
разделить такие коды на 8-битные байты.
Что происходит, когда вы достигаете конец файла, а у вас не набралось 8 бит для печати. Все, что вам нужно сделать, это заполнить накопленные биты достаточным количеством 0 и распечатать его в выходной файл.
Мы покажем вам заголовок информацию, которую программа сжатия, которую я написал, предоставляет в начало сжатого файла, чтобы программа декомпрессии могла правильно декодировать сжатый файл.
Заголовок Информация
Вы должны сохранить некоторые начальные информация в сжатом файле, которая будет использоваться декомпрессией/распаковкой программа. По сути, вы должны хранить дерево, которое используется для сжатия исходный файл. Это потому, что программа декомпрессии нуждается в точно таком же дерево для декодирования данных. Будем называть топологию информация заголовка. В начале сжатия есть три целых числа без знака:
·
Общее количество символов в сжатом
файл, как 4-байтовое целое число без знака.
· Общее количество символов, хранящих информация заголовка, то есть топология дерева кодирования Хаффмана, как 4-байтовое целое число без знака.
· Общее количество символов в оригинале несжатый файл, как 4-байтовое целое число без знака.
После трех беззнаковых целые числа, мы храним информацию о заголовке или топологию Дерево кодирования Хаффмана, а затем следует кодировка исходного текста. с помощью кодов Хаффмана. Мы описали кодировку исходного текста в предыдущих разделах. Теперь сосредоточимся на том, как топология Дерево кодирования Хаффмана сохраняется.
Чтобы сохранить дерево в начале файла,
мы используем обход в обратном порядке, записывая каждый
посещенный узел. Когда вы сталкиваетесь с конечным узлом, вы пишете
1, за которым следует ASCII
характер листового узла. Когда вы сталкиваетесь с нелистовым узлом, вы
напишите 0. Чтобы указать
конец дерева кодирования Хаффмана, мы пишем еще один
0.
Рассмотрим нить «иди, суслики», информация заголовка «1g1o01s1 01e1h01p1r00000», сразу же следует закодированный текст. Обход дерева кодирования Хаффмана в обратном порядке дает нам «1g1o01s1 01e1h01p1r0000». Еще один «0» отделяет топология из закодированного текста.
Для строки «улицы каменные звезды нет», информация заголовка «1t1a1r001n1o01 01e1s0000», затем по закодированному тексту.
В этих двух примерах мы используем символы 0 и от 1 до различать нелистовые и листовые узлы (и 0, чтобы указать конец топологии). Так как в каждом из двух например, есть восемь единиц, семь 0 для нелистовых узлов, и еще один 0, чтобы указать, что мы достигли конца топологии. Этот подход использовал в общей сложности 24 байта.
Информация заголовка может быть сделана более экономичной, если мы используем биты
0 и
от 1 до
различать нелистовые и листовые узлы, а также указывать
конец топологии.
В этих двух примерах всего будет 10 байтов (8 байтов
для листовых узлов и 2 байта для всех
0 и
1с). Проблема здесь в том, что и программы сжатия, и программы распаковки
пришлось бы обрабатывать биты вместо символов. Например, в битовом
подход, первые 16 бит (или первые 2 байта) информации заголовка
для кодирования
строка «улицы каменные звезды
не являются
10111010 01011000
(обратите внимание, что пробел в битовом потоке введен для большей ясности).
Кодировка ASCII для
‘t’ охватывает два байта,
7 бит в первом байте и 1 бит во втором байте. Второй наиболее
значащий бит во втором
байт равен 1,
указывает, что следующие 8 битов являются символом ASCII, из которых
старшие 6 бит символа
«а» содержится как минимум
значащие 6 бит второго байта.
В побитовом представлении дерева кодирования Хаффмана
последний байт не может содержать 8 бит. В этом случае мы снова дополняем его
с 0 бит. Рассмотрим случай
где входной файл использует девять различных символов ASCII. Номер
битов, необходимых для представления дерева кодирования Хаффмана, составляет
9×8 + 9×2 = 90 бит, что может быть представлено 12 байтами. Другими словами, последний байт должен содержать только два полезных бита.
За 12 байтами следует закодированный текст.
Программа декомпрессии или дегазации
Учитывая сжатый файл, который содержит информацию о заголовке, а затем битовым потоком, соответствующим кодировке исходного файла, программа декомпрессии должна выполнять следующие задачи:
1. Построить дерево кодирования Хаффмана на основе заголовка информация. Вам, вероятно, понадобится второе целое число без знака, хранящееся в начало сжатого файла, чтобы помочь с построением.
2.
Побитовое чтение из сжатого файла
(начиная с места после информации заголовка). Используйте чтение
бит для обхода дерева кодирования Хаффмана (0 слева и 1 справа),
начиная с корневого узла. Когда программа достигает конечного узла, напечатайте
соответствующий символ ASCII в выходной файл. Начинается с
корневой узел дерева кодирования Хаффмана, когда считывается следующий бит.
Программа завершается, когда количество декодированных символов совпадает с
количество символов, хранящихся как третье целое число без знака в начале
сжатый файл.
Чтобы построить дерево кодирования Хаффмана из информации заголовка, мы делаем использование стека. Когда 1 (бит или символ в зависимости от того, имеем ли мы дело с битовым или символьное представление) читается, мы читаем следующий байт и нажимаем соответствующий символ ASCII в стек. Когда 0 (бит или символ) читается, если стек содержит только один элемент, имеем построили все дерево кодирования Хаффмана. В противном случае должно быть больше чем один элемент в стеке. Мы создаем новый узел и выдвигаем верхний два элемента из стека. Мы делаем первый элемент из стека правый дочерний элемент нового узла и второй элемент вне стека левый дочерний элемент нового узла. После этого проталкиваем только что созданный node в стек.
Задача заключается в чтении бита из сжатого файла. Снова,
чтение из файла происходит на уровне байтов. В программе декомпрессии
вам нужно прочитать 8-битный символ ASCII, который занимает два байта в
сжатый файл, когда вы хотите построить дерево кодирования Хаффмана.