Warum nicht wörtlich umsetzen? :)
(a?1:0)+(b?1:0)+(c?1:0) >= 2
In C könnte man einfach schreiben a+b+c >= 2
(oder !!a+!!b+!!c >= 2
um sehr sicher zu sein).
Als Antwort auf TofuBier Vergleich von Java-Bytecode, hier ist ein einfacher Leistungstest:
class Main
{
static boolean majorityDEAD(boolean a,boolean b,boolean c)
{
return a;
}
static boolean majority1(boolean a,boolean b,boolean c)
{
return a&&b || b&&c || a&&c;
}
static boolean majority2(boolean a,boolean b,boolean c)
{
return a ? b||c : b&&c;
}
static boolean majority3(boolean a,boolean b,boolean c)
{
return a&b | b&c | c&a;
}
static boolean majority4(boolean a,boolean b,boolean c)
{
return (a?1:0)+(b?1:0)+(c?1:0) >= 2;
}
static int loop1(boolean[] data, int i, int sz1, int sz2)
{
int sum = 0;
for(int j=i;j<i+sz1;j++)
{
for(int k=j;k<j+sz2;k++)
{
sum += majority1(data[i], data[j], data[k])?1:0;
sum += majority1(data[i], data[k], data[j])?1:0;
sum += majority1(data[j], data[k], data[i])?1:0;
sum += majority1(data[j], data[i], data[k])?1:0;
sum += majority1(data[k], data[i], data[j])?1:0;
sum += majority1(data[k], data[j], data[i])?1:0;
}
}
return sum;
}
static int loop2(boolean[] data, int i, int sz1, int sz2)
{
int sum = 0;
for(int j=i;j<i+sz1;j++)
{
for(int k=j;k<j+sz2;k++)
{
sum += majority2(data[i], data[j], data[k])?1:0;
sum += majority2(data[i], data[k], data[j])?1:0;
sum += majority2(data[j], data[k], data[i])?1:0;
sum += majority2(data[j], data[i], data[k])?1:0;
sum += majority2(data[k], data[i], data[j])?1:0;
sum += majority2(data[k], data[j], data[i])?1:0;
}
}
return sum;
}
static int loop3(boolean[] data, int i, int sz1, int sz2)
{
int sum = 0;
for(int j=i;j<i+sz1;j++)
{
for(int k=j;k<j+sz2;k++)
{
sum += majority3(data[i], data[j], data[k])?1:0;
sum += majority3(data[i], data[k], data[j])?1:0;
sum += majority3(data[j], data[k], data[i])?1:0;
sum += majority3(data[j], data[i], data[k])?1:0;
sum += majority3(data[k], data[i], data[j])?1:0;
sum += majority3(data[k], data[j], data[i])?1:0;
}
}
return sum;
}
static int loop4(boolean[] data, int i, int sz1, int sz2)
{
int sum = 0;
for(int j=i;j<i+sz1;j++)
{
for(int k=j;k<j+sz2;k++)
{
sum += majority4(data[i], data[j], data[k])?1:0;
sum += majority4(data[i], data[k], data[j])?1:0;
sum += majority4(data[j], data[k], data[i])?1:0;
sum += majority4(data[j], data[i], data[k])?1:0;
sum += majority4(data[k], data[i], data[j])?1:0;
sum += majority4(data[k], data[j], data[i])?1:0;
}
}
return sum;
}
static int loopDEAD(boolean[] data, int i, int sz1, int sz2)
{
int sum = 0;
for(int j=i;j<i+sz1;j++)
{
for(int k=j;k<j+sz2;k++)
{
sum += majorityDEAD(data[i], data[j], data[k])?1:0;
sum += majorityDEAD(data[i], data[k], data[j])?1:0;
sum += majorityDEAD(data[j], data[k], data[i])?1:0;
sum += majorityDEAD(data[j], data[i], data[k])?1:0;
sum += majorityDEAD(data[k], data[i], data[j])?1:0;
sum += majorityDEAD(data[k], data[j], data[i])?1:0;
}
}
return sum;
}
static void work()
{
boolean [] data = new boolean [10000];
java.util.Random r = new java.util.Random(0);
for(int i=0;i<data.length;i++)
data[i] = r.nextInt(2) > 0;
long t0,t1,t2,t3,t4,tDEAD;
int sz1 = 100;
int sz2 = 100;
int sum = 0;
t0 = System.currentTimeMillis();
for(int i=0;i<data.length-sz1-sz2;i++)
sum += loop1(data, i, sz1, sz2);
t1 = System.currentTimeMillis();
for(int i=0;i<data.length-sz1-sz2;i++)
sum += loop2(data, i, sz1, sz2);
t2 = System.currentTimeMillis();
for(int i=0;i<data.length-sz1-sz2;i++)
sum += loop3(data, i, sz1, sz2);
t3 = System.currentTimeMillis();
for(int i=0;i<data.length-sz1-sz2;i++)
sum += loop4(data, i, sz1, sz2);
t4 = System.currentTimeMillis();
for(int i=0;i<data.length-sz1-sz2;i++)
sum += loopDEAD(data, i, sz1, sz2);
tDEAD = System.currentTimeMillis();
System.out.println("a&&b || b&&c || a&&c : " + (t1-t0) + " ms");
System.out.println(" a ? b||c : b&&c : " + (t2-t1) + " ms");
System.out.println(" a&b | b&c | c&a : " + (t3-t2) + " ms");
System.out.println(" a + b + c >= 2 : " + (t4-t3) + " ms");
System.out.println(" DEAD : " + (tDEAD-t4) + " ms");
System.out.println("sum: "+sum);
}
public static void main(String[] args) throws InterruptedException
{
while(true)
{
work();
Thread.sleep(1000);
}
}
}
Auf meinem Rechner (Ubuntu auf Intel Core 2 + sun java 1.6.0_15-b03 mit HotSpot Server VM (14.1-b02, gemischter Modus)) wird das Folgende gedruckt:
Erste und zweite Iteration:
a&&b || b&&c || a&&c : 1740 ms
a ? b||c : b&&c : 1690 ms
a&b | b&c | c&a : 835 ms
a + b + c >= 2 : 348 ms
DEAD : 169 ms
sum: 1472612418
Spätere Iterationen:
a&&b || b&&c || a&&c : 1638 ms
a ? b||c : b&&c : 1612 ms
a&b | b&c | c&a : 779 ms
a + b + c >= 2 : 905 ms
DEAD : 221 ms
Ich frage mich, was Java VM tun könnte, das verschlechtert Leistung im Zeitverlauf für den Fall (a + b + c >= 2).
Und so sieht es aus, wenn ich java mit einer -client
VM-Schalter:
a&&b || b&&c || a&&c : 4034 ms
a ? b||c : b&&c : 2215 ms
a&b | b&c | c&a : 1347 ms
a + b + c >= 2 : 6589 ms
DEAD : 1016 ms
Geheimnisvoll...
Und wenn ich es in GNU-Java-Interpreter wird es fast 100 Mal langsamer, aber die a&&b || b&&c || a&&c
Version gewinnt dann.
Ergebnisse von Tofubeer mit dem neuesten Code unter OS X:
a&&b || b&&c || a&&c : 1358 ms
a ? b||c : b&&c : 1187 ms
a&b | b&c | c&a : 410 ms
a + b + c >= 2 : 602 ms
DEAD : 161 ms
Ergebnisse von Paul Wagland mit einem Mac Java 1.6.0_26-b03-383-11A511
a&&b || b&&c || a&&c : 394 ms
a ? b||c : b&&c : 435 ms
a&b | b&c | c&a : 420 ms
a + b + c >= 2 : 640 ms
a ^ b ? c : a : 571 ms
a != b ? c : a : 487 ms
DEAD : 170 ms
173 Stimmen
Integrieren Sie die Return-Anweisung.
82 Stimmen
atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou)
1 Stimmen
Wäre es C gewesen, hätte man die Booleschen Werte einfach addieren können. Vielleicht war es das, woran er dachte, aber er vergaß, dass Java das nicht kann?
6 Stimmen
Thorbjørn: Verwendet C nicht zero/nonzero für bools? Ich glaube nicht, dass das in C überhaupt funktionieren würde, z.B.,
atLeastTwo(0,2,0)
.1 Stimmen
Ihr Gesprächspartner sollte "verbessert" definieren, bevor Sie etwas anderes tun können. Die Einfügung von if/else wäre vernünftig, aber alles andere beweist nur, wie schlau sie sind.
3 Stimmen
Ken, Sie könnten !! verwenden, um sicherzustellen, dass der Wert entweder 1 oder 0 ist, d.h. (!!A + !!B + !!C)>=2. Dennoch ist die unten angegebene ?: Version besser.
2 Stimmen
@Ken: Nach C99 muss man immer dann, wenn man aus einem
bool
erhalten Sie immer entweder 0 oder 1. Daher würde das Zusammenzählen in C99 immer funktionieren.3 Stimmen
LOL, das ist es, was mein Lehrer für funktionale Programmierung als "Boolesche Angst" bezeichnen würde: Anstatt das vollkommen akzeptable Ergebnis eines booleschen Ausdrucks zu verwenden, wird eine Kontrollstruktur verwendet, um es zu umhüllen und entweder Wahr oder Falsch zurückzugeben. Offenbar wirkt es beruhigend, wenn man genau sieht, was man zurückgibt, anstatt den logischen Operatoren zu vertrauen.
5 Stimmen
Return true; //math joke : if vs if and only if
93 Stimmen
Warum bewerten die Leute die trivialsten Fragen hoch?
4 Stimmen
Ernsthaft, wie kann das 78 Bewertungen bekommen?
52 Stimmen
Fragen, die allgemein und leicht verständlich sind, erhalten viele Stimmen. Fragen, die sehr spezifisch und technisch sind, nicht.
0 Stimmen
Sollte eine separate Frage gestellt werden, wie Sie dies in Ihrer Lieblingssprache tun würden, und die Antworten, die nicht aus Java stammen, dorthin verschoben werden?
0 Stimmen
Es wird nicht nur hochgestuft, sondern sogar als Favorit markiert (47 Favoriten). WOW!
1 Stimmen
@BlueRaja-DannyPflughoeft die einfachen Fragen werden hochgevotet, weil jeder sie versteht, und diese Frage hat auch ein paar gute Antworten bekommen.
1 Stimmen
125 Interviewer haben sich für diese Frage entschieden. Und sie werden bekommen, was sie verdient haben ;)
0 Stimmen
Sie können eine Methode schreiben wie getTrueValuesSize(boolean[] values) { List<Boolean> trueValues = new ArrayList(); for (int i = 0; i < values.length; i++) { if (values[i] == true) { trueValues.add(bolArray[i]); } }} // wenn die Anzahl der Bedingungen zunimmt, wird es schwer zu pflegen und fehleranfällig, wenn die Bedingung oder das Schließen der Klammern nicht richtig erfolgt.
0 Stimmen
@BlueRaja-DannyPflughoeft, de.wikipedia.org/wiki/Parkinson's_law_of_triviality
2 Stimmen
Es kommt darauf an, was "verbessern" hier bedeutet: Lesbarkeit oder Leistung.