<?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[Effizientes Durchlaufen einer negativen Menge]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Menge an Symbolen (konkret: Zeichen) in einer Menge <code>M</code> . Außerdem habe ich ein Alphabet Σ. Das Alphabet ist einfach als Bereich von 0 bis <code>ValueSize&lt;alphabet_t&gt;::VALUE</code> gegeben.</p>
<p>Ich muss jetzt über die Menge Σ\ <code>M</code> iterieren (konkret: Es handelt sich um eine negative Zeichenklasse und ich konstruiere ein Bitmuster für einen finiten Automaten, welcher einen regulären Ausdruck repräsentiert). Im Moment mache ich das einfach folgendermaßen (die Menge ist dabei als Vektor gegeben):</p>
<pre><code class="language-cpp">for (char_t c = 0; c &lt;= ValueSize&lt;char_t&gt;::VALUE; ++c)
    if (std::find(M.begin(), M.end(), c) == M.end())
        // Ausgeben.
</code></pre>
<p>… ist natürlich nicht besonders effizient. Jetzt ist die Frage, ob die Verwendung von 'std::set_difference' schneller wäre (ich iteriere nur *einmal* über die Menge, allerdings mache ich das mit mehreren Mengen und das Alphabet bleibt dasselbe) und insbesondere, ob 'std::set_difference' eventuell für einige Datentypen spezialisiert ist (ich könnte mir z.B. vorstellen, dass es effizienter auf einem 'std::set' läuft, da die Werte hier sortiert sind).</p>
<p>Weiß da jemand mehr drüber? Die SGI-Doku schweigt sich aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181073/effizientes-durchlaufen-einer-negativen-menge</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 04:02:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181073.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 May 2007 17:34:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Effizientes Durchlaufen einer negativen Menge on Wed, 09 May 2007 17:34:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Menge an Symbolen (konkret: Zeichen) in einer Menge <code>M</code> . Außerdem habe ich ein Alphabet Σ. Das Alphabet ist einfach als Bereich von 0 bis <code>ValueSize&lt;alphabet_t&gt;::VALUE</code> gegeben.</p>
<p>Ich muss jetzt über die Menge Σ\ <code>M</code> iterieren (konkret: Es handelt sich um eine negative Zeichenklasse und ich konstruiere ein Bitmuster für einen finiten Automaten, welcher einen regulären Ausdruck repräsentiert). Im Moment mache ich das einfach folgendermaßen (die Menge ist dabei als Vektor gegeben):</p>
<pre><code class="language-cpp">for (char_t c = 0; c &lt;= ValueSize&lt;char_t&gt;::VALUE; ++c)
    if (std::find(M.begin(), M.end(), c) == M.end())
        // Ausgeben.
</code></pre>
<p>… ist natürlich nicht besonders effizient. Jetzt ist die Frage, ob die Verwendung von 'std::set_difference' schneller wäre (ich iteriere nur *einmal* über die Menge, allerdings mache ich das mit mehreren Mengen und das Alphabet bleibt dasselbe) und insbesondere, ob 'std::set_difference' eventuell für einige Datentypen spezialisiert ist (ich könnte mir z.B. vorstellen, dass es effizienter auf einem 'std::set' läuft, da die Werte hier sortiert sind).</p>
<p>Weiß da jemand mehr drüber? Die SGI-Doku schweigt sich aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281833</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 09 May 2007 17:34:43 GMT</pubDate></item><item><title><![CDATA[Reply to Effizientes Durchlaufen einer negativen Menge on Wed, 09 May 2007 17:40:15 GMT]]></title><description><![CDATA[<p>Nachtrag: SGI hat natürlich doch etwas dazu zu sagen (man muss nur richtig schauen) … aber eventuell hat ja jemand konkrete Infos. Ich würde eigentlich sofort nach dieser Lösung greifen aber die Konstruktion eines Sets dauert ja auch seine Zeit ….</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281836</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 09 May 2007 17:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to Effizientes Durchlaufen einer negativen Menge on Wed, 09 May 2007 18:53:11 GMT]]></title><description><![CDATA[<p>Dein Alphabet hat doch eine konstante Länge, oder?</p>
<p>Wie wärs dann die Teilmengen gleich bei der Konstruktion auf</p>
<pre><code class="language-cpp">std::bitset&lt;ValueSize&lt;alphabet_t&gt;::VALUE &gt;
</code></pre>
<p>(n. Zeichen =&gt; Bit n-1)</p>
<p>abzubilden? Die Negationen sind dann jeweils die Differenzmengen.</p>
<p>Das müsste schneller als eine allgemine Sortierung sein.</p>
<p>Grüsse</p>
<p>*this</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281891</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Wed, 09 May 2007 18:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to Effizientes Durchlaufen einer negativen Menge on Wed, 09 May 2007 19:06:13 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Gast++ schrieb:</p>
<blockquote>
<p>Dein Alphabet hat doch eine konstante Länge, oder?</p>
<p>Wie wärs dann die Teilmengen gleich bei der Konstruktion auf</p>
<pre><code class="language-cpp">std::bitset&lt;ValueSize&lt;alphabet_t&gt;::VALUE &gt;
</code></pre>
<p>(n. Zeichen =&gt; Bit n-1)</p>
<p>abzubilden? Die Negationen sind dann jeweils die Differenzmengen.</p>
</blockquote>
<p>Das ist korrekt, aber inwiefern hilft das hier? Diese Bitsets müsste ich dann ja trotzdem in Mengen packen und eine Mengendifferenz bilden. Das dürfte nicht schneller laufen, als wenn ich die Differenz von den Char-Arrays bilde (es ist ja dasselbe, nur dass ich als Datentyp 'char_t' halt 'std::bitset' einsetzen würde). Oder habe ich Dich da falsch verstanden?</p>
<p>(Abgesehen davon nutzt mir die Repräsentation als 'bitset' nicht, da ich mit anderen Datenstrukturen arbeite.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281904</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 09 May 2007 19:06:13 GMT</pubDate></item><item><title><![CDATA[Reply to Effizientes Durchlaufen einer negativen Menge on Wed, 09 May 2007 19:27:36 GMT]]></title><description><![CDATA[<p>Das Bitset repräsentiert die Auswahl aus der Gesamtmenge; und hat deshalb jeweils soviele Bit wie Sigma Zeichen hat.</p>
<p>1 bei Bit n-1 bedeutet &quot;Zeichen n von Sigma&quot; in Teilmenge v.h.<br />
0 nicht v.h.</p>
<p>Grüsse</p>
<p>*this</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1281920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281920</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Wed, 09 May 2007 19:27:36 GMT</pubDate></item><item><title><![CDATA[Reply to Effizientes Durchlaufen einer negativen Menge on Wed, 09 May 2007 19:28:39 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>alles klar, der Tip ist gut. So werde ich es machen.</p>
<p>PS: Vielen Dank. <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/1281921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281921</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 09 May 2007 19:28:39 GMT</pubDate></item></channel></rss>