<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fxposter&#039;s wave &#187; Hash-Table</title>
	<atom:link href="http://blog.fxposter.org/tag/hash-table/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Stories about Ruby, JavaScript, Objective-C and other cool tools</description>
	<lastBuildDate>Sun, 30 Oct 2011 20:00:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>C++ Classes: Search Tree, Hash Table</title>
		<link>http://blog.fxposter.org/2007/04/13/c-classes-search-tree-hash-table/</link>
		<comments>http://blog.fxposter.org/2007/04/13/c-classes-search-tree-hash-table/#comments</comments>
		<pubDate>Fri, 13 Apr 2007 15:09:31 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Универ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Hash-Table]]></category>
		<category><![CDATA[Search-Tree]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2007/04/13/c-classes-search-tree-hash-table/</guid>
		<description><![CDATA[Еще две лабораторные работы: бинарное дерево поиска и хеш таблица (хеш-таблица еще не документирована). Исходники и примеры работы с классами - далее по тексту. Пример работы с деревом: #include &#60;iostream&#62; #include "tree.h" void echo(fx::Node&#60;int, int&#62;&#38; node) { std::cout &#60;&#60; node.value() &#60;&#60; '\n'; } int main() { fx::Tree&#60;int, int&#62; t(1, 3); t.add(5, 2); t.add(2, 2); t.add(8, [...]]]></description>
			<content:encoded><![CDATA[<p>Еще две лабораторные работы: бинарное дерево поиска и хеш таблица (<em>хеш-таблица еще не документирована</em>).</p>
<p>Исходники и примеры работы с классами - далее по тексту.</p>
<p><span id="more-94"></span>Пример работы с деревом:</p>
<pre><code class="cpp">#include &lt;iostream&gt;
#include "tree.h"

void echo(fx::Node&lt;int, int&gt;&amp; node)
{
    std::cout &lt;&lt; node.value() &lt;&lt; '\n';
}

int main()
{
    fx::Tree&lt;int, int&gt; t(1, 3);
    t.add(5, 2);
    t.add(2, 2);
    t.add(8, 10);
    t.add(15, -10);
    t.add(12, 5);
    t.add(20, 15);
    t.add(16, 2);
    t.add(30, 2);
    t.add(25, 20);
    t.add(35, 230);
    t.add_to_root(111, 1);
    t.remove(35);
    t.remove(25);

    // выводим с помощью итератора
    for(fx::Tree&lt;int, int&gt;::iterator_depth i = t.begin_depth(); i != t.end_depth(); ++i)
    {
        std::cout &lt;&lt; *i &lt;&lt; '\n';
    }
    std::cout &lt;&lt; '\n';

    // выводим с помощью итератора
    for(fx::Tree&lt;int, int&gt;::iterator_width i = t.begin_width(); i != t.end_width(); ++i)
    {
        std::cout &lt;&lt; *i &lt;&lt; '\n';
    }
    std::cout &lt;&lt; '\n';
    // доступ к корню
    std::cout &lt;&lt; t.root()-&gt;key() &lt;&lt; '\n';
    // поиск по ключу
    std::cout &lt;&lt; t.find(30).value() &lt;&lt; '\n';

    // подсчет количества различиных узлов в дереве
    std::cout &lt;&lt; t.count() &lt;&lt; '\n';
    std::cout &lt;&lt; t.count_if(&amp;fx::Node&lt;int, int&gt;::leaf) &lt;&lt; '\n';
    std::cout &lt;&lt; t.count_if(&amp;fx::Node&lt;int, int&gt;::node_one) &lt;&lt; '\n';
    std::cout &lt;&lt; t.count_if(&amp;fx::Node&lt;int, int&gt;::node_two) &lt;&lt; '\n';

    // подсчет количества различиных узлов на каждом уровне дерева
    for(unsigned int i = 0; i &lt; t.height(); ++i)
    {
        std::cout &lt;&lt; t.on_level(i) &lt;&lt; '\t'
                      &lt;&lt; t.on_level_if(i, &amp;fx::Node&lt;int, int&gt;::leaf)&lt;&lt; '\t'
                      &lt;&lt; t.on_level_if(i, &amp;fx::Node&lt;int, int&gt;::node_one) &lt;&lt; '\t'
                      &lt;&lt; t.on_level_if(i, &amp;fx::Node&lt;int, int&gt;::node_two) &lt;&lt; '\n';
    }

    // высота и максимальная ширина дерева
    std::cout &lt;&lt; t.height() &lt;&lt; '\n';
    std::cout &lt;&lt; t.width() &lt;&lt; '\n';

    // является ли дерево деревом поиска
    // для всех узлов: ключ правого подузла больше ключа узла
    // и ключ левого подузла меньше ключа узла
    std::cout &lt;&lt; t.search_tree() &lt;&lt; '\n';

    // длины наибольшего вырожденного и полного поддеревьев
    std::cout &lt;&lt; t.degenerated() &lt;&lt; '\n';
    std::cout &lt;&lt; t.full() &lt;&lt; '\n';

    // обходы, выполняется функция echo для каждого узла: echo(узел)
    t.infix_traverse(echo);
    t.prefix_traverse(echo);
    t.postfix_traverse(echo);
    t.width_traverse(echo);

    return 0;
}</code></pre>
<p>Пример работы с хеш-таблицей:</p>
<pre><code class="cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include "hash.h"

unsigned int hash(const std::string&amp; str)
{
    unsigned int k = 0;
    for(unsigned int i = 0; i &lt; str.size(); ++i)
    {
        k *= str[i];
        k %= 1009;
    }
    return k;
}

unsigned int hash2(const std::string&amp; str)
{
    unsigned int k = 0;
    for(unsigned int i = 0; i &lt; str.size(); ++i)
    {
        k *= str[i];
        k %= 1099;
    }
    return k;
}

int main()
{
    fx::HashTable&lt;std::string, int&gt; h(&amp;hash, 1009);
    h.add("Петя the best", 0);
    h.add("Петя2 the best", 0);
    h.add("Петя the best3", 0);
    h.add("Вася", 1);
    h.add("Вася the best", 0);
    h.remove("Вася the best");

    // выводим значение, соответствующее ключу "Вася" - 1
    std::cout &lt;&lt; h["Вася"].value() &lt;&lt; '\n';

    // присваеваем записи в таблице с ключем "Вася" значение 20
    h["Вася"] = 20;

    // выводим значение, соответствующее ключу "Вася" - 20
    std::cout &lt;&lt; h["Вася"].value() &lt;&lt; '\n';

    // количество записей в таблице на данный момент
    std::cout &lt;&lt; h.size();

    // проверка - пустая ли таблица
    std::cout &lt;&lt; h.empty();

    // степень заполненности таблицы (0...1)
    std::cout &lt;&lt; h.full_percent() &lt;&lt; '\n';

    // меняем размер таблицы
    h.rehash(&amp;hash2, 1099);

    // и опять смотрим степень заполненности
    std::cout &lt;&lt; h.full_percent() &lt;&lt; '\n';

    // выводим значение, соответствующее ключу "Вася"
    std::cout &lt;&lt; h["Вася"].value() &lt;&lt; '\n';

    return 0;
}</code></pre>
<p>Файлы: <a href="http://blog.fxposter.org/wp-content/uploads/2007/04/tree.h" title="Search Tree">Search Tree</a>, <a href="http://blog.fxposter.org/wp-content/uploads/2007/04/hash.h" title="Hash Table">Hash Table</a>, <a href="http://blog.fxposter.org/wp-content/uploads/2007/04/exception.h" title="Exception">Exception</a> (нужен для работы остальных).</p>
<p><em><strong>PS</strong>. Для работы хеш-таблицы дерево тоже нужно.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2007/04/13/c-classes-search-tree-hash-table/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: blog.fxposter.org @ 2012-02-10 06:08:21 -->
