Sortering och sökning i Python

Om du fick ett papper med en lista med 1000 namn, och du blev ombedd att hitta ett namn, men den här listan var inte i någon ordning (t ex alfabetisk ordning) skulle det vara väldigt frustrerande, eller hur? Att sätta den listan i ordning, även om det tar lång tid, gör att namnet blir mycket enklare. Att ha saker i ordning är sålunda en naturlig lust som vi människor har och att söka på denna lista skulle tydligt ta mindre ansträngning än att söka en oorderad lista.

Låt oss flytta till datorvärlden, där listorna man kan behöva söka är väldigt stora, och där prestanda kan påverkas även med snabba datorer. I detta fall har en lämplig sortering och sökning algoritmen skulle vara en lösning på ett sådant problem. Medan sortering handlar om att sätta en lista över värden i ordning, sökande är processen att hitta positionen av ett värde inom en lista.

För att klargöra hur kritisk denna fråga kan vara, låt mig visa dig vad Donald Knuth, en amerikansk datavetenskapare, matematiker och professor emeritus vid Stanford University nämnt i Art of Computer Programming, vol.3, Sortering och sökning, sid 3:

Datorproducenter från 1960-talet uppskattade att mer än 25 procent av speltiden på sina datorer spenderades på sortering när alla kunder togs i beaktande. Faktum är att det fanns många installationer där sorteringen var ansvarig för mer än hälften av beräkningstiden. Från denna statistik kan vi konstatera att antingen (i) det finns många viktiga sorteringsanvändningar, eller (ii) många sorterar när de inte borde, eller (iii) ineffektiva sorteringsalgoritmer har varit vanliga.

I denna handledning beskriver jag specifikt Urval Sortera algoritm (sortering) och Linjär sökning algoritm (sökning).

Urval sorteringsalgoritm

De Urval Sortera algoritmen baseras på successivt urval av minima- eller maxima-värden. Antag att vi har en lista som vi vill sortera i stigande ordning (från mindre till större värden). Det minsta elementet kommer att finnas i början av listan, och det största elementet kommer att vara i slutet av listan. 

Låt oss säga att originallistan ser ut som följer:

| 7 | 5 | 3,5 | 4 | 3.1 |

Det första vi gör är att hitta minimum värdet i listan, vilket är i vårt fall 3,1

Efter att ha hittat minimivärdet, byta det lägsta värdet med det första elementet i listan. Det är byt ut 3,1 med 7. Listan kommer nu att se ut som följer:

| 3.1 | 5 | 3,5 | 4 | 7 |

Nu när vi är säkra på att det första elementet befinner sig i rätt position i listan, upprepar vi ovanstående steg (hitta minimivärdet) från och med andra element i listan. Vi kan konstatera att minimivärdet i listan (från det andra elementet) är 3,5. Vi byter sålunda nu 3,5 med 5. Listan blir nu som följer:

| 3.1 | 3,5 | 5 | 4 | 7 |

Vid den här tiden är vi säkra på att det första elementet och det andra elementet befinner sig i sina korrekta positioner.

Nu kontrollerar vi lägsta värdet i resten av listan, som börjar från det tredje elementet 5. Minsta värdet i resten av listan är 4, och vi byter nu det med 5. Listan blir sålunda följande:

| 3.1 | 3,5 | 4 | 5 | 7 |

Så vi är nu säkra på att den första tre elementen är i rätt positioner, och processen fortsätter på så sätt. 

Låt oss se hur urvalssalgoritmen implementeras i Python (baserat på Isai Damier):

def selectionSort (aList): för jag i intervallet (len (aList)): minst = i för k inom intervallet (i + 1, len (aList)): om aList [k] < aList[least]: least = k swap(aList, least, i) def swap(A, x, y): temp = A[x] A[x] = A[y] A[y] = temp

Låt oss testa algoritmen genom att lägga till följande påståenden i slutet av ovanstående skript:

my_list = [5,76,4,7,25,3,4,6,32,4,55,3,52,3,7,6,7,3,86,7,43,5] selectionSort (my_list) skriv ut my_list

I det här fallet ska du få följande utdata:

[4,6, 4,7, 5,76, 7,3, 7,6, 25,3, 32,4, 43,5, 52,3, 55,3, 86,7]

Linjär sökalgoritm

De Linjär Sök algoritmen är en enkel algoritm, där varje objekt i listan (från det första objektet) undersöks tills det önskade objektet finns eller listan har nåtts. 

Linjärsökningsalgoritmen implementeras i Python enligt följande (baserat på Python School):

def linearSearch (item, my_list): found = False position = 0 medan position < len(my_list) and not found: if my_list[position] == item: found = True position = position + 1 return found

Låt oss testa koden. Ange följande uttalande i slutet av Python-skriptet ovan:

väska = ['bok', 'penna', 'penna', 'notisbok', 'sharpener', 'gummi'] item = input ('Vilket objekt vill du kontrollera i påsen?') itemFound = linearSearch (objekt, väska) om itemFound: print 'Ja, varan är i väskan' annars: print 'Oj, ditt föremål verkar inte vara i väskan'

När du anger inmatning, se till att det är mellan enkla eller dubbla citat (dvs.. 'penna'). Om du skriver in 'penna', till exempel bör du få följande utdata:

Ja, varan är i väskan

Om du kommer in 'linjal' som input får du följande utdata:

Oj, ditt föremål verkar inte vara i väskan

Som vi kan se visar Python sig själv igen som ett programmeringsspråk som gör det enkelt att programmera algoritmiska begrepp som vi gjorde här, sortering och sökande algoritmer.

Det är viktigt att notera att det finns andra typer av sorterings- och sökalgoritmer. Om du vill dyka djupare in i sådana algoritmer med Python, kan du hänvisa till den här sidan.