# Algorithmus



## RezaScript (18. Sep 2019)

Hallo,

ich arbeite zurzeit an einem Algorithmus, habe zwar keine technische Frage, sondern mir geht es viel mehr um den Aufbau und das Konzept.

Ich habe ein Array das so aussieht:


```
array(3) {
  [0]=>
  array(2) {
    [19]=>
    array(3) {
      ["uid"]=>
      int(19)
      ["range"]=>
      int(100)
      ["value"]=>
      string(6) "Zurich"
    }
    [3]=>
    array(3) {
      ["uid"]=>
      int(3)
      ["range"]=>
      int(100)
      ["value"]=>
      string(6) "zurich"
    }
  }
  [1]=>
  array(1) {
    [19]=>
    array(3) {
      ["uid"]=>
      int(19)
      ["range"]=>
      int(100)
      ["value"]=>
      string(11) "Switzerland"
    }
  }
  [2]=>
  array(1) {
    [3]=>
    array(3) {
      ["uid"]=>
      int(3)
      ["range"]=>
      int(50)
      ["value"]=>
      string(1) "m"
    }
  }
}
```

Der Benutzer hätte gerne eine männliche Person, welche aus Zürich, Schweiz kommt.

Wie mit dem Key `uid` zu erkennen ist, kommen zwei Personen infrage:
Person 1 (uid: 19): Zürich, Schweiz
Person 2 (uid: 3): Zürich, männlich

Die Werte des Schlüssels `range` basieren auf mathematische Formeln. In diesem Beispiel habe ich es einfach gehalten. Wir haben also 100 für die Stadt und für das Land sowie 50 für das Geschlecht. 

Am Schluss wird folgendes ausgerechnet:
Alle Range-Values vom User zusammenzählen, dessen Wert dividieren durch Anzahl derselben uid. 

Beispiel: 
Person 1: 100 + 100 / 2 = 100
Person 2: 100 + 50 / 2 = 75

Der höchste Wert darf nur 100 sein und die Person mit dem höchsten Wert, gewinnt das Rennen. In diesem Fall wäre es die Person 1.

Was denkt ihr? Passt das so oder würdet ihr anders voran gehen?


----------



## mihe7 (18. Sep 2019)

Du möchtest also einen nach Attribut gewichteten Grad der Übereinstimmung eines Eintrags mit der Suchanfrage berechnen? Kann man natürlich so machen. 


```
Algorithmus bewerteTreffer(t : Treffer, s : Suchanfrage) {
    gesamt := 0
    übereinstimmungen := 0
    Für jedes Attribut a aus s {
        Falls Wert von a mit Wert des entsprechenden Attributs aus t übereinstimmt {
            g := ermittle Gewicht von Attribut a
            erhöhe gesamt um g
            erhöhe übereinstimmungen um 1
        }
    }
    falls übereinstimmugnen == 0
        gib 0 zurück
    sonst 
        gib gesamt / übereinstimmungen zurück
}
```


----------

