Finde das Jahr mit der höchsten Anzahl an lebenden Personen in Python

8

Wenn Sie eine Liste von Personen mit ihren Geburts- und Endjahren (alle zwischen 1900 und 2000 ) angeben, finden Sie das Jahr mit der höchsten Anzahl an lebenden Personen.

Hier ist meine etwas brutale Lösung:

%Vor%

Ich versuche, eine effizientere Möglichkeit zu finden, dieses Problem in Python zu lösen. Beide - readability und efficiency zählt. Außerdem wird mein Code aus irgendeinem Grund [1938, 1939] nicht ausgeben, solange es sollte.

Aktualisieren

Eingabe ist ein list von Tupeln, wobei das erste Element eines Tupels ein year ist, wenn eine Person geboren wurde, und das zweite Element eines tuple das Jahr des Todes ist.

Update 2

Das Endjahr (zweiter Teil des Tupels) zählt ebenso wie ein Jahr des Lebens der Person (wenn also die Person in Sept 1939 stirbt (uns interessiert der Monat nicht), lebt er tatsächlich 1939, zumindest einen Teil davon). Das sollte die 1939 'fehlenden Ergebnisse beheben.

Beste Lösung?

Während die Lesbarkeit zugunsten von @ joran-beasley zählt, wurde der effizienteste Algorithmus für größere Eingaben von @ njzk2 . Danke @ hannes-ovrén für die Bereitstellung von Analysen in IPython-Notizbuch auf Gist

    
oski86 20.07.2015, 17:15
quelle

6 Antworten

3
%Vor%     
Joran Beasley 20.07.2015, 17:17
quelle
3

Ich würde so gehen:

  • Sortieren Sie Personen nach Geburtsjahr ( unborn list)
  • Von der ersten Geburt an
    • Fügen Sie diese Person in die alive -Liste
    • ein
    • Verwenden Sie eine Einfügung, sortiert nach Todesdatum (die Liste bleibt sortiert, verwenden Sie also eine binäre Suche)
    • Bis du eine Person erreichst, die nicht in diesem Jahr geboren wurde
  • Dann, beginnend mit der Person in der alive -Liste, die zuerst stirbt, entfernen Sie sie aus der Liste.
  • Geben Sie die Größe der alive -Liste in ein dict
  • ein
  • Erhöhen Sie das Jahr
  • Schleife, bis die Listen unborn und alive leer sind

Die Komplexität sollte ungefähr O((m + n) * log(m)) sein (jedes Jahr wird nur einmal betrachtet und jede Person nur zweimal, multipliziert mit den Einfügekosten in der alive -Liste)

Implementierung

%Vor%     
njzk2 20.07.2015 17:30
quelle
3

Eine andere Lösung, die ich gerade von:

  • Erstellen Sie 2 Tabellen, birthdates und deathdates .
  • Akkumulieren Sie Geburtsdaten und Todesdaten in diesen Tabellen.
  • Durchsuchen Sie diese Tabellen, um die Anzahl der zu dieser Zeit lebenden Personen zu sammeln.

Die Gesamtkomplexität ist O(n)

Implementierung

%Vor%

Besser

%Vor%     
njzk2 20.07.2015 18:31
quelle
2

Wir können auch numpy slicing verwenden, das ziemlich ordentlich ist, und sollte auch ziemlich effizient sein:

%Vor%

BEARBEITEN Es sieht so aus, als ob das Nametuple ein wenig Overhead hinzufügt. Um also ein bisschen mehr zu beschleunigen, entfernen Sie das Nametuple und tun Sie es for birth, death in people: stattdessen.

    
Hannes Ovrén 20.07.2015 17:52
quelle
0

Wie wäre es mit diesem:

%Vor%

Es ist nicht von der Jahresspanne betroffen, aber es ist nlogn in | pop | (es sei denn, Sie würden eine Radix-Sortierung durchführen, die ~ 10n für eine Jahrtausendspanne wäre und für | pop | & gt; 1000 schneller sein sollte). Kann nicht beides haben. Eine sehr allgemeine Lösung müsste zuerst scannen und basierend auf der gemessenen Jahresspanne und | pop | entscheiden, welcher Algorithmus verwendet werden soll.

    
ZXX 14.07.2017 09:41
quelle
-2

Ich kam über den folgenden Code, der genau das ist, was Sie brauchen.

Nehmen wir an, der Bereich der Jahre ist 1900 - 2000

Schritte des Algorithmus

  1. Konstruiere ein Array X aus 100 ganzen Zahlen (alle auf Null initialisiert; 101 ganze Zahlen, wenn das Jahr 2000 enthalten ist).
  2. Erhöhe für jede der N Personen X [Geburtsjahr - 1900] um eins und dekrementiere X [Todesjahr - 1900] um Eins.
  3. Iteriere durch X und behalte eine Summe jedes Elements bei, während du gehst. Das Jahr mit den meisten lebenden Menschen ist 1900 plus der Index, wo die Summe maximal ist.

Code (Python wie angefordert)

%Vor%

Kredit "Brian Schmitz" hier

    
BNAndroid 30.07.2017 20:34
quelle

Tags und Links