<div dir="ltr">On Wed, Oct 30, 2019 at 12:06 PM Andrey Savchenko &lt;<a href="mailto:bircoph@altlinux.org">bircoph@altlinux.org</a>&gt; wrote:<br>&gt;<br>&gt; On Wed, 30 Oct 2019 05:04:27 +0300 Alexey Tourbin wrote:<br>&gt; &gt; On Tue, Oct 29, 2019 at 9:23 PM Andrey Savchenko &lt;<a href="mailto:bircoph@altlinux.org">bircoph@altlinux.org</a>&gt; wrote:<br>&gt; &gt; &gt; Ðš ÑÐ¾Ð¶Ð°Ð»ÐµÐ½Ð¸ÑŽ, Ð´Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð¹ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹ ÑÑ‚ого Ð½ÐµÐ´Ð¾ÑÑ‚аточно:<br>&gt; &gt;<br>&gt; &gt; Ð”авайте Ñ€ÐµÑˆÐ¸Ð¼ Ñ€ÐµÐ°Ð»ÑŒÐ½ÑƒÑŽ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñƒ. Ð§Ñ‚о Ð²Ñ‹ Ñ…отите ÑÐ´ÐµÐ»Ð°Ñ‚ÑŒ? Left outer join?<br>&gt;<br>&gt; Ð—адача ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ:<br>&gt;<br>&gt; 1) Ð•сть Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ека foo-1.0<br>&gt; 2) ÐžÐ½Ð° Ð¾Ð±Ð½Ð¾Ð²Ð¸Ð»Ð°ÑÑŒ Ð´Ð¾ foo-1.0.1<br>&gt; 3) Ð’озник unmet Ð¿Ð°ÐºÐµÑ‚а bar Ð½Ð° libfoo.so (&gt;= set:abcdef)<br>&gt;<br>&gt; ÐœÐ½Ðµ Ð½ÑƒÐ¶Ð½Ð¾ Ð·Ð½Ð°Ñ‚ÑŒ, ÐºÐ°ÐºÐ¸Ñ… Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð² Ð¸Ð· foo ÑÑ‚ало Ð½Ðµ Ñ…ватать bar.<br><br>Ну Ð¸ Ñ‡ÐµÐ²Ð¾?  Ð•сть set-версия R Ð¸ ÐµÑÑ‚ÑŒ Ð¼Ð½Ð¾Ð¶ÐµÑÑ‚ва ÑÑ‚рок P0 Ð¸ P1. P0 ÑƒÐ´Ð¾Ð²Ð»ÐµÑ‚воряет R, Ð° P1 - Ð½Ðµ ÑƒÐ´Ð¾Ð²Ð»ÐµÑ‚ворят (какие-то ÑÑ‚роки Ð¸Ð· P1 ÑƒÐ´Ð°Ð»Ð¸Ð»Ð¸).  Ð•сть Ð³Ð¾Ñ‚овые Ð¿Ñ€Ð¸Ð¼Ð¸Ñ‚ивы ÐºÐ°Ðº ÑÑ‚о Ñ€Ð°ÑÐ¿Ð°ÐºÐ¾Ð²Ð°Ñ‚ÑŒ Ð² Ð¼Ð°ÑÑÐ¸Ð²Ñ‹, ÐºÐ°Ðº Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ð½Ð° Ñ€Ð¸ÑÑƒÐ½ÐºÐµ.<br><br><font face="monospace">  Â  P0 Â  Â  Â  Â  Â  P1 Â  Â  Â  Â  R<br>+----+----+ Â +----+----+ Â +----+<br>| h0 | s0 | Â | h0 | s0 | Â | h0 |<br>+----+----+ Â +----+----+ Â +----+<br>| h1 | s1 | Â | h2 | s2 | Â | h1 |<br>+----+----+ Â +----+----+ Â +----+<br>| h2 | s2 | Â | h3 | s3 | Â | h3 |<br>+----+----+ Â +----+----+ Â +----+<br>| h3 | s3 | Â | h4 | s4 |<br>+----+----+ Â +----+----+<br></font><br>На Ñ€Ð¸ÑÑƒÐ½ÐºÐµ Ð²Ð¸Ð´Ð½Ð¾, Ñ‡Ñ‚о Ð² Ð½Ð¾Ð²Ð¾Ð¹ Ð²ÐµÑ€ÑÐ¸Ð¸ P1 ÑƒÐ´Ð°Ð»Ð¸Ð»ÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð» s1 Ñ Ñ…ешем h1 (а Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»ÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð» s4 Ñ Ñ…ешем h4).  ÐšÐ°Ðº Ñ‚огда ÑÐ¸ÑÑ‚ематически Ð½Ð°Ð¿ÐµÑ‡Ð°Ñ‚ать Ð½ÐµÐ´Ð¾ÑÑ‚ающие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ‹?  Ð’нешний Ñ†Ð¸ÐºÐ» Ð±ÑƒÐ´ÐµÑ‚ Ð¿Ð¾ R: Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñ…еша Ð² R Ð¼Ñ‹ ÑÐ¼Ð¾Ñ‚рим, ÐµÑÑ‚ÑŒ Ð»Ð¸ Ñ‚акой Ð¶Ðµ Ñ…еш Ð² P1.  Ð•сли ÐµÑÑ‚ÑŒ, Ñ‚о Ð¾Ð½ ÑƒÐ´Ð¾Ð²Ð»ÐµÑ‚ворен, Ð¸ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹ Ð½ÐµÑ‚.  Ð Ð¸Ð½Ð°Ñ‡Ðµ Ð¾Ð½ Ð½ÐµÑƒÐ´Ð¾Ð²Ð»ÐµÑ‚ворен, Ñ‚огда Ð½Ð°Ð¼ Ð½ÑƒÐ¶Ð½Ð¾ Ð½Ð°Ð¹Ñ‚и ÑÐ¸Ð¼Ð²Ð¾Ð» Ñ Ñ‚аким Ð¶Ðµ Ñ…ешем Ð² P0 Ð¸ ÐµÐ³Ð¾ Ð½Ð°Ð¿ÐµÑ‡Ð°Ñ‚ать. Ð’ Ð¾Ð±Ñ‰ÐµÐ¼, Ñ Ð½ÐµÐ¿Ñ€Ð¸Ð²Ñ‹Ñ‡ÐºÐ¸ Ð½Ð°Ð¿Ð¸ÑÐ°Ñ‚ÑŒ Ñ‚акой Ñ†Ð¸ÐºÐ» Ð¼Ð¾Ð¶ÐµÑ‚ Ð¸ ÑÐ»Ð¾Ð¶Ð½Ð¾Ð²Ð°Ñ‚о, Ð½Ð¾ ÐµÑÐ»Ð¸ Ð´ÑƒÐ¼Ð°Ñ‚ÑŒ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑÐºÐ¸, Ñ‚о Ð½Ð¸Ñ‡ÐµÐ³Ð¾ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð³Ð¾ Ð² ÑÑ‚ом Ð½ÐµÑ‚.  Ð“лавное Ð½Ðµ Ð¿Ñ‹Ñ‚аться ÐºÐ°Ð¶Ð´Ñ‹Ð¹ Ñ€Ð°Ð· Ð¸ÑÐºÐ°Ñ‚ÑŒ Ð² P1 Ð¸ P0 Ñ ÑÐ°Ð¼Ð¾Ð³Ð¾ Ð½Ð°Ñ‡Ð°Ð»Ð°, Ñ‚огда Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ся ÐºÐ²Ð°Ð´Ñ€Ð°Ñ‚ичная ÑÐ»Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ.  Ð§Ñ‚обы Ð¾ÑÑ‚алась Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ ÑÐ»Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ, Ð½ÑƒÐ¶Ð½Ð¾ &quot;подтягивать&quot; P0 Ð¸ P1 Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ñ‹Ñ… Ð¸Ñ‚ераций (алгоритмы Ñ‚акого Ñ€Ð¾Ð´Ð°, &quot;подтягивания&quot; Ð½ÐµÑÐºÐ»ÑŒÐºÐ¸Ñ… Ð¾Ñ‚сортированных ÑÐ¿Ð¸ÑÐºÐ¾Ð², Ð½Ð°Ð·Ñ‹Ð²Ð°ÑŽÑ‚ся merge algorithms).  Ð”ля ÑÑ‚ого Ð²Ð²ÐµÐ´ÐµÐ¼ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ðµ P1h - Ñ‚екущий Ñ…еш, P1i - ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð¸Ð¹ Ð¸Ð½Ð´ÐµÐºÑ, Ð¿Ð¾ Ð¿Ñ€Ð¸Ð½Ñ†Ð¸Ð¿Ñƒ P1h = P1[P1i++].v, Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¾ Ð´Ð»Ñ P0. Ð¢Ð¾Ð³Ð´Ð° Ñ†Ð¸ÐºÐ» Ð¿Ð¾Ð»ÑƒÑ‡Ð°ÐµÑ‚ся Ñ‚аким:<br><br>  Â  size_t P0i = 0;<br>  Â  size_t P1i = 0;<br>  Â  uint32_t P0h = P0[P0i++].v;<br>  Â  uint32_t P1h = P1[P1i++].v;<br>  Â  for (size_t i = 0; i &lt; Rn; i++) {<br>  Â  Â  Â  uint32_t Rh = R[i];<br>  Â  Â  Â  // advance P1<br>  Â  Â  Â  while (P1h &lt; Rh &amp;&amp; P1i &lt; P1n)<br>  Â  Â  Â  Â  Â  P1h = P1[P1i++].v;<br>  Â  Â  Â  // does P1 satisfy Rh?<br>  Â  Â  Â  if (P1h == Rh)<br>  Â  Â  Â  Â  Â  continue;<br>  Â  Â  Â  // advance P0<br>  Â  Â  Â  while (P0h &lt; Rh &amp;&amp; P0i &lt; P0n)<br>  Â  Â  Â  Â  Â  P0h = P0[P0i++].v;<br>  Â  Â  Â  // P0 then must satisfy Rh<br>  Â  Â  Â  assert(P0h == Rh);<br>  Â  Â  Â  // print the symbol associated with P0h<br>  Â  Â  Â  fputs(P0[P0i-1].s, stdout);<br>  Â  Â  Â  // more than one symbol may hash to Rh,<br>  Â  Â  Â  // print them on the same line<br>  Â  Â  Â  while (P0i &lt; P0n &amp;&amp; (P0h = P0[P0i++].v) == Rh)<br>  Â  Â  Â  Â  Â  putchar(&#39; &#39;), fputs(P0[P0i-1].s, stdout);<br>  Â  Â  Â  putchar(&#39;\n&#39;);<br>  Â  }<br><br>Прикрепил Ð¿Ð¾Ð»Ð½Ñ‹Ð¹ Ð¿Ñ€Ð¸Ð¼ÐµÑ€. Ð’ Ð¾Ð±Ñ‰ÐµÐ¼, Ð³Ð»Ð°Ð²Ð½Ð¾Ðµ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑÐºÐ¸ Ð¼Ñ‹ÑÐ»Ð¸Ñ‚ÑŒ. Ð¡Ð¿Ñ€Ð¾ÑÐ¸Ñ‚е Ñ‚ам Ñƒ Ð•вгенича, Ð¾Ð½ Ð²Ð°Ð¼ ÑÐºÐ°Ð¶ÐµÑ‚.<br><br># Usage: unset P0.txt P1.txt set:R<br>$ ./unset &lt;(print -l a b c) &lt;(print -l a b d) $(print -l a c |/usr/lib/rpm/mkset 10)<br>c<br></div>