<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Verbesserung gesucht]]></title><description><![CDATA[<p>Hi</p>
<p>Es geht um eine Umsetzung des <a href="http://www.cse.iitb.ac.in/dbms/Data/Courses/CS632/1999/clustering/node12.html#SECTION00033100000000000000" rel="nofollow">Johnson's Algorithm</a> für das Clustering.</p>
<p>Wie kann ich folgenden Code verbessern im Sinn auf Speicher, Geschwindigkeit und Richtigkeit (zB const correctness)</p>
<pre><code class="language-cpp">#ifndef CLUSTERING_H
#define CLUSTERING_H

#include &lt;vector&gt;
#include &lt;map&gt;

class Clustering
{
    public:
        class Point
        {
            public:
                Point( double _x = 0, double _y = 0 )
                :   id( last_id++ ), x( _x ), y( _y )
                {   }
                static int last_id;
                int id;
                double x;
                double y;
        };

        typedef std::vector&lt; std::pair&lt;double, double&gt; &gt; Points;
        typedef std::map&lt;int, Point&gt; Cluster;
        typedef std::map&lt;int, Cluster&gt; Clusters;

        // Ctor: Creates for every single point a cluster
        Clustering( const Points&amp; points );
        virtual ~Clustering();
        const Clusters&amp; get_clusters() const;

        // Starts computation
        // max_dist: maximal distance for points in a cluster
        void compute_clusters( const double max_dist = 127 );

    private:
        void merge_clusters( Cluster&amp; a, Cluster&amp; b );
        std::pair&lt; double, std::pair&lt;int, int&gt; &gt; find_closest_clusters() const;
        double single_link_dist( const Cluster&amp; a, const Cluster&amp; b ) const;
        double dist( const Point&amp; a, const Point&amp; b ) const;

        Clusters clusters;
};

#endif // CLUSTERING_H
//-----------------------------------------------------//
//
#include &quot;Clustering.h&quot;

#include &lt;cmath&gt;
#include &lt;iomanip&gt;
#include &lt;iostream&gt;

Clustering::Clustering( const Clustering::Points&amp; points )
{
    for( Points::const_iterator it = points.begin();
         it != points.end(); ++it )
    {
        Point point( it-&gt;first, it-&gt;second );
        Cluster cluster;
        cluster.insert( std::make_pair( point.id, point ) );
        clusters.insert( std::make_pair( point.id, cluster ) );
    }
}

Clustering::~Clustering()
{
    //dtor
}

const Clustering::Clusters&amp; Clustering::get_clusters() const
{
    return clusters;
}

void Clustering::compute_clusters( const double max_dist )
{
    std::pair&lt; double, std::pair&lt;int, int&gt; &gt; result = find_closest_clusters();
    while( result.first &lt; max_dist )
    {
        Clusters::iterator a = clusters.find( result.second.first );
        Clusters::iterator b = clusters.find( result.second.second );
        merge_clusters( a-&gt;second, b-&gt;second );
        clusters.erase( b );
        result = find_closest_clusters();
    }
}

void Clustering::merge_clusters
    ( Clustering::Cluster&amp; a, Clustering::Cluster&amp; b )
{
    a.insert( b.begin(), b.end() );
    b.clear();
}

std::pair&lt; double, std::pair&lt;int, int&gt; &gt; Clustering::find_closest_clusters() const
{
    double min = std::numeric_limits&lt;double&gt;::max();
    int a = 0;
    int b = 0;
    for( Clusters::const_iterator it_a = clusters.begin();
         it_a != clusters.end(); ++it_a )
    {
        Clusters::const_iterator it_b = it_a;
        ++it_b;
        for( ; it_b != clusters.end(); ++it_b )
        {
            double dist = single_link_dist( it_a-&gt;second, it_b-&gt;second );
            if( 0 &lt; dist &amp;&amp; dist &lt; min )
            {
                min = dist;
                a = it_a-&gt;first;
                b = it_b-&gt;first;
            }
        }
    }
    return std::make_pair( min, std::make_pair( a, b ) );
}

double Clustering::single_link_dist
    ( const Clustering::Cluster&amp; a, const Clustering::Cluster&amp; b ) const
{
    double min = std::numeric_limits&lt;double&gt;::max();
    double tmp = min;
    for( Cluster::const_iterator it_a = a.begin();
         it_a != a.end(); ++it_a )
    {
        for( Cluster::const_iterator it_b = b.begin();
             it_b != b.end(); ++it_b )
        {
            tmp = dist( it_a-&gt;second, it_b-&gt;second );
            if( tmp &lt; min ) min = tmp;
        }
    }
    return min;
}

double Clustering::dist( const Clustering::Point&amp; a, const Clustering::Point&amp; b ) const
{
    return fabs( a.x - b.x ) + fabs( a.y - b.y );
}

int Clustering::Point::last_id = 0;
</code></pre>
<p>Für jegliche Tipps, Kritiken und Anregungen offen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>MfG<br />
Anton P.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189677/verbesserung-gesucht</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 14:59:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189677.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Aug 2007 18:52:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verbesserung gesucht on Wed, 15 Aug 2007 18:52:37 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>Es geht um eine Umsetzung des <a href="http://www.cse.iitb.ac.in/dbms/Data/Courses/CS632/1999/clustering/node12.html#SECTION00033100000000000000" rel="nofollow">Johnson's Algorithm</a> für das Clustering.</p>
<p>Wie kann ich folgenden Code verbessern im Sinn auf Speicher, Geschwindigkeit und Richtigkeit (zB const correctness)</p>
<pre><code class="language-cpp">#ifndef CLUSTERING_H
#define CLUSTERING_H

#include &lt;vector&gt;
#include &lt;map&gt;

class Clustering
{
    public:
        class Point
        {
            public:
                Point( double _x = 0, double _y = 0 )
                :   id( last_id++ ), x( _x ), y( _y )
                {   }
                static int last_id;
                int id;
                double x;
                double y;
        };

        typedef std::vector&lt; std::pair&lt;double, double&gt; &gt; Points;
        typedef std::map&lt;int, Point&gt; Cluster;
        typedef std::map&lt;int, Cluster&gt; Clusters;

        // Ctor: Creates for every single point a cluster
        Clustering( const Points&amp; points );
        virtual ~Clustering();
        const Clusters&amp; get_clusters() const;

        // Starts computation
        // max_dist: maximal distance for points in a cluster
        void compute_clusters( const double max_dist = 127 );

    private:
        void merge_clusters( Cluster&amp; a, Cluster&amp; b );
        std::pair&lt; double, std::pair&lt;int, int&gt; &gt; find_closest_clusters() const;
        double single_link_dist( const Cluster&amp; a, const Cluster&amp; b ) const;
        double dist( const Point&amp; a, const Point&amp; b ) const;

        Clusters clusters;
};

#endif // CLUSTERING_H
//-----------------------------------------------------//
//
#include &quot;Clustering.h&quot;

#include &lt;cmath&gt;
#include &lt;iomanip&gt;
#include &lt;iostream&gt;

Clustering::Clustering( const Clustering::Points&amp; points )
{
    for( Points::const_iterator it = points.begin();
         it != points.end(); ++it )
    {
        Point point( it-&gt;first, it-&gt;second );
        Cluster cluster;
        cluster.insert( std::make_pair( point.id, point ) );
        clusters.insert( std::make_pair( point.id, cluster ) );
    }
}

Clustering::~Clustering()
{
    //dtor
}

const Clustering::Clusters&amp; Clustering::get_clusters() const
{
    return clusters;
}

void Clustering::compute_clusters( const double max_dist )
{
    std::pair&lt; double, std::pair&lt;int, int&gt; &gt; result = find_closest_clusters();
    while( result.first &lt; max_dist )
    {
        Clusters::iterator a = clusters.find( result.second.first );
        Clusters::iterator b = clusters.find( result.second.second );
        merge_clusters( a-&gt;second, b-&gt;second );
        clusters.erase( b );
        result = find_closest_clusters();
    }
}

void Clustering::merge_clusters
    ( Clustering::Cluster&amp; a, Clustering::Cluster&amp; b )
{
    a.insert( b.begin(), b.end() );
    b.clear();
}

std::pair&lt; double, std::pair&lt;int, int&gt; &gt; Clustering::find_closest_clusters() const
{
    double min = std::numeric_limits&lt;double&gt;::max();
    int a = 0;
    int b = 0;
    for( Clusters::const_iterator it_a = clusters.begin();
         it_a != clusters.end(); ++it_a )
    {
        Clusters::const_iterator it_b = it_a;
        ++it_b;
        for( ; it_b != clusters.end(); ++it_b )
        {
            double dist = single_link_dist( it_a-&gt;second, it_b-&gt;second );
            if( 0 &lt; dist &amp;&amp; dist &lt; min )
            {
                min = dist;
                a = it_a-&gt;first;
                b = it_b-&gt;first;
            }
        }
    }
    return std::make_pair( min, std::make_pair( a, b ) );
}

double Clustering::single_link_dist
    ( const Clustering::Cluster&amp; a, const Clustering::Cluster&amp; b ) const
{
    double min = std::numeric_limits&lt;double&gt;::max();
    double tmp = min;
    for( Cluster::const_iterator it_a = a.begin();
         it_a != a.end(); ++it_a )
    {
        for( Cluster::const_iterator it_b = b.begin();
             it_b != b.end(); ++it_b )
        {
            tmp = dist( it_a-&gt;second, it_b-&gt;second );
            if( tmp &lt; min ) min = tmp;
        }
    }
    return min;
}

double Clustering::dist( const Clustering::Point&amp; a, const Clustering::Point&amp; b ) const
{
    return fabs( a.x - b.x ) + fabs( a.y - b.y );
}

int Clustering::Point::last_id = 0;
</code></pre>
<p>Für jegliche Tipps, Kritiken und Anregungen offen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>MfG<br />
Anton P.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1345226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1345226</guid><dc:creator><![CDATA[Anton P.]]></dc:creator><pubDate>Wed, 15 Aug 2007 18:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserung gesucht on Sat, 18 Aug 2007 09:48:32 GMT]]></title><description><![CDATA[<p>*push*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346791</guid><dc:creator><![CDATA[Anton P.]]></dc:creator><pubDate>Sat, 18 Aug 2007 09:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserung gesucht on Sat, 18 Aug 2007 10:02:34 GMT]]></title><description><![CDATA[<p>das hier: <a href="http://www.lim.univ-mrs.fr/~thiel/npic/src/dist_gsym.c" rel="nofollow">http://www.lim.univ-mrs.fr/~thiel/npic/src/dist_gsym.c</a><br />
ist wohl auch eine implementation dieses algos (steht jedenfalls in den comments). kannst' ja mal mit deinem vergleichen...<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1346794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1346794</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Sat, 18 Aug 2007 10:02:34 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserung gesucht on Mon, 20 Aug 2007 16:55:35 GMT]]></title><description><![CDATA[<p>Undertaker schrieb:</p>
<blockquote>
<p>das hier: <a href="http://www.lim.univ-mrs.fr/~thiel/npic/src/dist_gsym.c" rel="nofollow">http://www.lim.univ-mrs.fr/~thiel/npic/src/dist_gsym.c</a><br />
ist wohl auch eine implementation dieses algos (steht jedenfalls in den comments). kannst' ja mal mit deinem vergleichen...<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Danke, aber das ist ein anderer, der macht Permutationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1348443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1348443</guid><dc:creator><![CDATA[Anton P.]]></dc:creator><pubDate>Mon, 20 Aug 2007 16:55:35 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserung gesucht on Wed, 22 Aug 2007 12:38:05 GMT]]></title><description><![CDATA[<p>*push* <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>funktionieren tut es ja, wollt nur mal bitten den code anzuschauen obs richtig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1349764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1349764</guid><dc:creator><![CDATA[Anton P.]]></dc:creator><pubDate>Wed, 22 Aug 2007 12:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Verbesserung gesucht on Thu, 23 Aug 2007 03:47:43 GMT]]></title><description><![CDATA[<p><em>überflieg</em> sieht gut aus:)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1350131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1350131</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 23 Aug 2007 03:47:43 GMT</pubDate></item></channel></rss>