Ich glaub ich kann das schon ganz gut nachvollziehen, was du da machen willst. Was ich da aber im Moment lese an deinen Ideen lässt mich aber ein bischen zweifeln, ob du dir wirklich schon tiefergehende Überlegungen dazu gemacht hast, wie du das Problem "geschickt" lösen kannst. Das Problem ist ja wirklich ganz interessant, aber auch nicht ganz einfach. Muss ja performant sein, sonst interessierts keine Sau.
Hast du eigentlich mal ne Vorlesung "Algorithmen und Datenstrukturen" gehört? Wenn nicht, dann kann ich dir NUR empfehlen das schnellstmöglich nach zu holen. Wenn du derartige Probleme angehst, dann brauchst du vor allem einen guten Algorithmus und eine dazu passende Datenstruktur, bzw. umgekehrt. Die von mir genannte Komplexitätsanalyse ist da ein sehr gutes Hilfsmittel, um sich an zu schauen, ob der von dir erdachte Algorthmus überhaupt Sinn macht, oder eben nicht. Bei solchen Sachen hast du ja, wie schon gesagt immer das Problem, das es eben performant sein muss, ansonsten interessiert es keine Sau, und das macht es nicht gerade einfach...
Eine Vorlesung "Rechnerarchitektur" wäre wohl auch nicht das schlechteste, was dir noch passieren könnte, wenn du noch keine gehört hast. Btw. Bachelor oder Masterarbeit?
Eine ganz WICHTIGE Frage, die du dir stellen solltest ist auch, ob du einmal Objekte erstellst, und dann nur noch aus dem Speicher eben diese Vorlagen abrufst, oder ob du diese Umsetzung nur einmalig machst, und dann eben abspeicherst. Je nachdem wirst du wahrscheinlich auch komplett andere Datenstrukturen wählen.
Mich hat es z.B. SEHR verwundert, das du verkettete Listen verwendest. Mir ist nicht klar, wie du diese genau verwendest und wie du Sie aufbaust, aber verkettete Listen erlauben eben keinen wahlweisen zugriff! Sie sind also sehr schlecht, wenn deine Zugriffe weit auseinander liegen. Verkette Listen sind eigentlich nur bei genau einer Sache wirklich richtig gut, und das ist als FIFO/LIFO und sonst, wenn du sehr viel einfügen und entfernen musst, aber selbst da gibts mit dynamischen Arrays und akkumulierter Effizienz effiziente Algorthmen mit Arrays. Bäume sind noch etwas, was man gut mit Listen abbilden kann. Ansonsten siehts aber eher schlecht aus. Und genau DIE Frage musst du dir halt stellen. Mache ich über die gesamte Laufzeit viele Einfüge/Entfernen Operationen oder nicht?
Bei Visualisierung würde ich eher sagen, dass du das einmalig machst, und dann immer nur wiederverwendest, also im Speicher hälst. Das spricht eigentlich dafür, dass du eher nur liest als das du ständig einfügst und entfernst.
Du solltest dir also überlegen, ob du dein Problem auf Arrays mappen kannst. Die erlauben halt einen wahlfreien Zugriff.
Einen Punkt, den du ja schon richtig angesprochen hast, sind Hashfunktionen. Die erlauben halt sowohl schnelles einfügen/entfernen als auch wahlfreien Zugriff. Das Problem ist halt, dass du eine gescheite Hashfunktion brauchst, ansonsten ist das Ganze fürn Poppes. Im Netz gibt es ein gutes Paper zur "optimalen Hashfunktion". Da wird ein Algorithmus vorgestellt, mit dm man sehr schnell eine optimale Hashfunktion berechnen kann. Das würde ich dir mal empfehlen. Wenn du die Ergebnisse sehr oft wiederverwendest, wovon ich ausgehe, amortisiert sich der Aufwand ja relativ schnell.
Und da kommen wir zu noch einem wichtigen Punkt. Du solltest schnellst möglich klären, ob Speicherverbrauch für dich ein relevantes Thema ist oder eben nicht. Wenn nicht, dann halt einfach alles im Speicher. Wenn ja, dann viel Spaß bei der Entscheidung, was raus kann, und was nicht.
Allgemein noch ein Punkt zu deiner Frage!
Gewöhn dir an, bei derart simplen Fragen einfach kurz ein minimales C/C++ (oder what ever was du nutzt) zu schreiben und das Problem einfach zu profilen!
Das liefert dir GENAU Ergebnisse.
Ich weiß jetzt nicht mehr, ob ich mich richtig erinnere, aber ich meine mich zu erinnern, das Modulo SEHR viel langsamer ist als die anderen mathematischen Operationen. Also selbst langsamer als Division, wobei ich mir da wirklich nicht mehr sicher bin. Ich würde halt genau obig genanntes als nächstes machen, aber ich denke das ist eine gute Übung für dich
Du solltest dir auch überlegen, ob du wirklich Modulo brauchst oder nicht! So wie sich das für mich anhört, hast du nur eine SEHR begrenzte Auswahl an Möglichkeiten. Ein Lookuptable in Form einer Hashtabelle wäre da durchaus auch eine Möglichkeit das zu lösen mit Hilfe von eventuell OR/XOR usw.
Mach dir halt mal wirklich gendanken, was du da machen willst, und mach dann eben die Komplextätsanalyse, bzw wenns schnell gehen soll einfache Laufzeitmessungen. Um die wirst du eh nicht rum kommen.
Cacheing wird für dich wohl auch ein Problem sein, um das du dir Gedanken machen solltest.
Multithreading kannst du wohl SEHR trivial lösen, indem du einfach mehrere Objekte nutzt. Ich hoffe doch, dass du nicht nur jeweils ein Objekt hast, das halt SEHR groß ist. Wenn doch, musst du halt geschickt segmentieren, ist aber auch kein unüberwindbares Problem.