Pascal - třídící algoritmy



Ahoj. Chtěl bych se zeptat, jak vytvořit algoritmus, kterýby mi seřadil proměnné v řetězci, a přitom zaznamenal jejich původní pořadí, abych je mohl následně popořadě vypsat ze záznamu společně s ostatními údaji.Já jsem začal řešit složitosti, a teď si s tím nevím rady.Díky za pomoc<https://pastebin.com/q5QAYUc0>//Doplněn odkaz na kód.//
Tvůj kód nehodlám číst, takže jen obecně. Na začátku před tím než budeš data řadit, tak si udělej jejich kopii. Pak si data seřaď a máš co jsi chtěl. V té kopii máš původní neseřazená data v původním pořadí.
<p>přiznávám, že jsem to nikdy předtím neudělal, takže došlo k trochu poškrábání hlavy. jednoduchá ukázková tabulka, která demonstruje:</p><pre><code>if exists (select * from sys.objects where object\_id = object\_id(n'[dbo].[mytable]') and type in (n'u')) drop table [dbo].[mytable] go create table dbo.mytable ( col1 int , col2 char(1) ) go insert dbo.mytable (col1, col2) values (1, 'a') insert dbo.mytable (col1, col2) values (1, 'b') insert dbo.mytable (col1, col2) values (1, 'c') insert dbo.mytable (col1, col2) values (2, 'a') insert dbo.mytable (col1, col2) values (2, 'b') insert dbo.mytable (col1, col2) values (2, 'c') insert dbo.mytable (col1, col2) values (3, 'a') insert dbo.mytable (col1, col2) values (3, 'b') insert dbo.mytable (col1, col2) values (3, 'c') </code></pre><p>pomocí parametru @sortstyle k rozlišení objednávek řazení se @sortstyle = 1 třídí podle <code>col1 asc, col2 desc</code> a @ sortstyle = 2 seřadit podle <code>col2 desc, col1 asc</code>.</p><pre><code>declare @sortstyle int set @sortstyle = 1 select col1 , col2 from dbo.mytable order by case when @sortstyle = 1 then col1 end asc, case when @sortstyle = 1 then col2 end desc, case when @sortstyle = 2 then col2 end desc, case when @sortstyle = 2 then col1 end asc set @sortstyle = 2 select col1 , col2 from dbo.mytable order by case when @sortstyle = 1 then col1 end asc, case when @sortstyle = 1 then col2 end desc, case when @sortstyle = 2 then col2 end desc, case when @sortstyle = 2 then col1 end asc </code></pre><p> <a href="https://dba.stackexchange.com/questions/4104/how-do-you-order-by-a-parameter/4111#4111">jak se objednáváte parametrem</a> pokrývá jednodušší případ třídění podle 1 sloupce.</p> <p>místo toho může vypadat čistěji pomocí klíče a cmp:</p><pre class="lang-py prettyprint-override"><code>newlist = sorted(list\_to\_be\_sorted, key=lambda k: k['name']) </code></pre><p>nebo jak navrhl j.f.sebastian a další,</p><pre class="lang-py prettyprint-override"><code>from operator import itemgetter newlist = sorted(list\_to\_be\_sorted, key=itemgetter('name')) </code></pre><p>pro úplnost (jak je uvedeno v komentářích fitzgeraldsteele) přidejte <code>reverse=true</code> pro řazení sestupně</p><pre class="lang-py prettyprint-override"><code>newlist = sorted(l, key=itemgetter('name'), reverse=true) </code></pre> <p>tradičně je "seřadit podle" označeno pomocí šipek nahoru/dolů, které představují třídění vzestupně nebo sestupně. názvy sloupců by měly mít vyšší úroveň kontrastu než hodnoty, například odvážnější text nebo stínované pozadí.</p><p>osobně při obarvení střídavých řádků obvykle přecházím na světlejší než na tmavší, protože efekt se zvyšuje tím výrazněji, čím déle vaši uživatelé interagují s tabulkou.</p><p>zde je několik skvělých příkladů možností rozvržení tabulky: <a href="http://patterntap.com/tap/collection/tables">http://patterntap.com/tap/collection/tables</a> </p> <p>chcete-li zkontrolovat nestandardní řazení ve sloupcích, můžete použít následující dotaz:</p><pre><code>select table\_schema, table\_name, column\_name, collation\_name from information\_schema.columns where collation\_name is not null order by table\_schema, table\_name, ordinal\_position; </code></pre><p>chcete-li najít řazení databáze, je třeba zadat dotaz <code>pg\_database</code>:</p><pre><code>select datname, datcollate from pg\_database; </code></pre><p>zde jsou relevantní stránky příručky postgresql:</p><ul> <li> <a href="http://www.postgresql.org/docs/current/static/infoschema-columns.html">http://www.postgresql.org/docs/current/static/infoschema-columns.html</a> </li> <li> <a href="http://www.postgresql.org/docs/current/static/infoschema-collations.html">http://www.postgresql.org/docs/current/static/infoschema-collations.html</a> </li> <li> <a href="http://www.postgresql.org/docs/current/static/catalog-pg-database.html">http://www.postgresql.org/docs/current/static/catalog-pg-database.html</a> </li> </ul> <p>kapitola 11 knihy <a href="http://rads.stackoverflow.com/amzn/click/0596514808">intel threading building blocks</a> autor james reinders se věnuje příkladům algoritmů a projektů, které využívají <a href="http://en.wikipedia.org/wiki/parallel\_computing">parallel computing</a> (nebo parallel programming): finder podřetězců, game of life, sieve of eratosthenes, matrix multiply a další pokročilejší témata, jako je filtrování síťových paketů a hry.</p> <pre><code>sed -i.old '1s;^;to be prepended;' infile </code></pre><ul> <li><code>-i</code> zapíše změnu na místo a provede zálohu v případě, že je poskytnuta nějaká přípona. (v tomto případě <code>.old</code>)</li> <li><code>1s;^;to be prepended;</code> nahrazuje začátek prvního řádku daným řetězcem nahrazení pomocí <code>;</code> jako oddělovače příkazů.</li> </ul> <p>v tomto pořadí: b (s podrobným popisem manipulace níže), a (vyhláskováno), c.</p><p>c je pro mě „typické technické řešení“: nejprve se rozhodnete, jak specifikovat dobu trvání, poté určíte data potřebná pro tento algoritmus. spravovat je však pouze dva další ovládací prvky a uživatelé neznají možnosti, které mají před sebou. to znamená, že pokud jsou vaši uživatelé technici/analytičtí myslitelé a je nejjednodušší je implementovat, jděte na to.</p><p>b by bylo vhodnější:</p><p><img src="https://i.stack.imgur.com/fl7eg.png" alt="enter image description here"></p><p>minimální požadavky:</p><ul> <li>ovládání „předvolby“ a ovládání data a času jsou vždy k dispozici (nikdy zakázáno)</li> <li>změnou předvolby se změní čas zobrazený v ovládacích prvcích rozsahu</li> <li>změnou ovládacích prvků rozsahu se změní předvolba na „ostatní“</li> </ul><p>téměř perfektní:</p><ul> <li>porovnejte ruční výběr s vašimi předvolbami a zobrazte „jiné“ pouze v případě, že neexistuje žádná shoda</li> <li>když uživatel ručně vybere „jiné“, zobrazí se nápověda jako „zde vyberte začátek a konec data“</li> </ul><p>výhody:</p><ul> <li>uživatelé s nejasnou představou o vaší aplikaci mají řadu typických možností</li> <li>uživatelé získají okamžitou a konkrétní zpětnou vazbu pro svůj výběr</li> <li>výběr může být upřesněn, např. „další 3 týdny“ lze snadno upravit na „4 týdny“</li> </ul><p>varianty:</p><ul> <li>místo „jiných“ generujte vhodné textové reprezentace (např. „příštích 17 dní“).</li> <li>pokud je aplikace používána většinou běžnými častými uživateli (málo příležitostných uživatelů), zvažte bezplatné zadávání textu, jako je hisham, doporučeno: kliknout a zadat tři časy v daném dni je v pořádku, pro zadávání 30 za hodinu je bolest a volný text vyhraje.<br> (nedokážu si představit jednoduché kombinované rozhraní, které nějakým způsobem neznevýhodňuje začínající uživatele, ale pokud očekáváte širokou škálu uživatelů, možná budete muset za to zvážit některá řešení)</li> </ul><p>poznámky k rozvržení:</p><ul> <li>vynechal bych „z“ čistě pro čistý vzhled, ale je tu kompromis. obecně se snažím dát ovládacím prvkům stejnou velikost a postavit je na několik řádků, abych se vyhnul vzhledu „neklidného tvaru“.</li> <li>seskupte předvolby skupiny a výběr data společně (tj. jim poskytněte určitou vzdálenost od ostatních výběrů)</li> <li>"trvání" je samozřejmě hloupý štítek, promiň;)</li> </ul><hr><p>(vedlejší poznámka: instinktivně bych předpokládal interval sedmi dnů, abych odešel „od 17. února, 0:00 do 23. února, 23: 59: 59,9999 ..“, ale nejsem si jistý, jestli je tento univerzální.)</p> <p>protože ostatní odpovědi již naznačují, sql server může nebo nemusí explicitně zajistit, že řádky jsou seřazeny v pořadí seskupených indexů před <code>insert</code>.</p><p>to závisí na tom, zda má klastrovaný indexový operátor v plánu sadu vlastností <code>dmlrequestsort</code> (což zase závisí na odhadovaném počtu řádků, které jsou vloženy).</p><p>pokud zjistíte, že sql server to z jakéhokoli důvodu podceňuje, můžete mít prospěch z přidání explicitního <code>order by</code> k dotazu <code>select</code> k minimalizaci rozdělení stránek a následné fragmentaci z operace <code>insert</code></p><p><strong> příklad: </strong></p><pre><code>use tempdb; go create table t(n int primary key,filler char(2000)) create table t2(n int primary key,filler char(2000)) go declare @t table (u uniqueidentifier primary key default newid(),n int) insert into @t(n) select number from master..spt\_values where type = 'p' and number between 0 and 499 /*estimated row count wrong as inserting from table variable*/ insert into t(n) select t1.n*1000 + t2.n from @t t1, @t t2 /*same operation using explicit sort*/ insert into t2(n) select t1.n*1000 + t2.n from @t t1, @t t2 order by t1.n*1000 + t2.n select avg\_fragmentation\_in\_percent, fragment\_count, page\_count, avg\_page\_space\_used\_in\_percent, record\_count from sys.dm\_db\_index\_physical\_stats(2, object\_id('t'), null, null, 'detailed') ; select avg\_fragmentation\_in\_percent, fragment\_count, page\_count, avg\_page\_space\_used\_in\_percent, record\_count from sys.dm\_db\_index\_physical\_stats(2, object\_id('t2'), null, null, 'detailed') ; </code></pre><p>ukazuje, že <code>t</code> je masivně roztříštěný</p><pre><code>avg\_fragmentation\_in\_percent fragment\_count page\_count avg\_page\_space\_used\_in\_percent record\_count      99.3116118225536 92535 92535 67.1668272794663 250000 99.5 200 200 74.2868173956017 92535 0 1 1 32.0978502594514 200 </code></pre><p>ale pro <code>t2</code> fragmentace je minimální</p><pre><code>avg\_fragmentation\_in\_percent fragment\_count page\_count avg\_page\_space\_used\_in\_percent record\_count      0.376 262 62500 99.456387447492 250000 2.1551724137931 232 232 43.2438349394613 62500 0 1 1 37.2374598468001 232 </code></pre><p>naopak někdy budete chtít donutit sql server, aby podceňoval počet řádků, když víte, že data jsou již předem roztříděna a chcete zabránit zbytečnému třídění. jedním z pozoruhodných příkladů je vložení velkého počtu řádků do tabulky pomocí seskupeného indexového klíče <code>newsequentialid</code>. <a href="https://connect.microsoft.com/sqlserver/feedback/details/668540/unnecessary-sort-operation-for-insert-into-clustered-index-with-newsequentialid-key">ve verzích sql serveru před denali sql server přidává zbytečnou a potenciálně nákladnou operaci řazení</a> . tomu lze zabránit</p><pre><code>declare @var int =2147483647 insert into foo select top (@var) * from bar </code></pre><p>sql server poté odhadne, že bude vloženo 100 řádků bez ohledu na velikost <code>bar</code>, která je pod prahem, při kterém je do plánu přidáno řazení. jak je však uvedeno v poznámkách níže, znamená to, že vložka bohužel nebude moci využít výhody minimálního protokolování.</p> <p>předpokládejme, že máme soubor test.xsd, který vypadá takto:</p><pre><code>&lt;?xml version="1.0"?&gt; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"&gt; &lt;xs:element name="myclass"&gt; &lt;xs:complextype&gt; &lt;xs:sequence&gt; &lt;xs:element name="field1" type="xs:string"/&gt; &lt;xs:element name="field2" type="xs:string"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complextype&gt; &lt;/xs:element&gt; &lt;/xs:schema&gt; </code></pre><ol> <li><p>vytváření tříd pomocí nástroje xsd:</p> <pre><code>xsd.exe /classes test.xsd </code></pre> <p>to vygeneruje soubor test.cs.</p></li> <li><p>přidat soubor test.cs do řešení.</p></li> <li><p>vytvořit instanci <code>myclass</code>, definovanou ve schématu xsd a xmlserialize:</p> <pre><code>using system.xml.serialization; // ... var data = new myclass { field1 = "test1", field2 = "test2" }; var serializer = new xmlserializer(typeof(myclass)); using (var stream = new streamwriter("c:\\test.xml")) serializer.serialize(stream, data); </code></pre></li> </ol><p>výsledek:</p><pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;myclass xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"&gt; &lt;field1&gt;test1&lt;/field1&gt; &lt;field2&gt;test2&lt;/field2&gt; &lt;/myclass&gt; </code></pre> <p>nezapomeňte na transakce. výkon je dobrý, ale jednoduchý (if exists ..) přístup je velmi nebezpečný.<br> když se několik podprocesů pokusí provést insert-or-update, můžete snadno získat narušení primárního klíče.</p><p>řešení poskytovaná @beau crawford &amp; @esteban ukazují obecnou myšlenku, ale náchylnou k chybám.</p><p>chcete-li se vyhnout zablokování a narušení pk, můžete použít něco takového:</p><pre><code>begin tran if exists (select * from table with (updlock,serializable) where key = @key) begin update table set ... where key = @key end else begin insert into table (key, ...) values (@key, ...) end commit tran </code></pre><p>nebo</p><pre><code>begin tran update table with (serializable) set ... where key = @key if @@rowcount = 0 begin insert into table (key, ...) values (@key,..) end commit tran </code></pre>