Median von 3 Elementen optimal?



  • Mahlzeit,

    ich muss den median von 3 Elementen möglichst optimal lösen. Entgegen der naiven Implementierung (if-else-Kaskade) ist meine aktuelle Implementierung:

    int median3 (int a, int b, int c) {
    	return max(min(a, b), min(max(a, b), c));
    }
    

    Dies sieht prinzipiell wunderbar aus, da der Controller die Instruktionen min/max direkt kennt (und der Compiler das auch kapiert). Assembler output (reduziert auf das wesentliche):

    median3:
    	max	%d15, %d5, %d4
    	min	%d2, %d5, %d4
    	min	%d6, %d6, %d15
    	max	%d2, %d6, %d2
    	ret
    

    Frage: Kann ich das beruhigt als optimale Lösung bezeichnen? Oder fällt jemandem noch was besseres ein?

    edit: Instruction set des Controllers, falls es interessiert: http://www4.informatik.uni-erlangen.de/Lehre/SS11/V_EZL/Doc/pdfs/hardware/Infineon/TC1_um_Vol2_InstructionSet_v135b.pdf



  • Schwer zu sagen, da ich irgendwie die Angabe von Latenzen vermisse.



  • Mal ne Frage aus Neugier:
    Wo ist das Problem bei diesem Code?

    return max(min(a, b), min(b, c));
    

    EDIT: Um mich klarer auszudrücken: Bei dieser gekürzten Fassung sehe ich kein Problem, da hier m. A. n. die Transitivität eingreift und somit die Max-Prüfung im zweiten Argument wegfallen kann.



  • knivil schrieb:

    Schwer zu sagen, da ich irgendwie die Angabe von Latenzen vermisse.

    Finde ich jetzt irgendwie nicht.

    Steffo schrieb:

    Mal ne Frage aus Neugier:
    Wo ist das Problem bei diesem Code?

    return max(min(a, b), min(b, c));
    

    Funktioniert nicht wenn b das min-Element ist.


Anmelden zum Antworten