2009-07-26 10 views

Odpowiedz

7

Sprawdź w Max function listach, które zwracają największą liczbę na liście. Stamtąd możesz sprawdzić, czy ta wartość jest mniejsza od pewnej liczby.

+0

Dzięki, dobry pomysł. – Nope

+0

Wystarczy, że przeliterujemy: 'magicFunction [lst_, val_]: = Max [lst] dreeves

3

Ten rodzaj badania jest łatwy do skonstruowania za pomocą 'Fold':

magicFunction[ lst_, val_ ] := 
Fold[ ((#2 < val) && #1) &, True, lst ] 

Sformułowanie '(# 2 < val)' jest test każdego elementu listy ('# 2'). Możesz umieścić tutaj dowolny test, abyś mógł wykonać bardziej wydajne testy niż w przypadku funkcji, którą można wyświetlić, np. Max.

" & # 1" następnie łączy wynik dla bieżącego elementu z wynikiem dla wszystkich poprzednich elementów.

A "True" to podstawa - wynik dla pustej listy.

Aby zobaczyć jak to działa, można przekazać w niektórych wartości niezdefiniowanych i zobaczyć, co rozszerza się wyrażenie:

In[10]:= magicFunction[ {a, b, c}, 10 ] 

Out[10]= c < 10 && b < 10 && a < 10 
6

Przed oferując moje rozwiązanie pozwól mi wypowiedzieć dotychczasowe dwa rozwiązania. Pozwala wywołać rozwiązanie Joey'a Roberta magicFunction1 i rozwiązanie Eric magicFunction2.

magicFunction1 jest bardzo krótki i elegancki. To, co mi się nie podoba, to to, że jeśli mam bardzo dużą listę liczb, a pierwsza jest już większa niż 10, wciąż będzie wykonywać całą pracę, aby znaleźć największą liczbę, która nie jest potrzebna. Odnosi się to również do magicFunction2

opracowałem dwa następujące rozwiązania:

magicFunction3[lst_, val_] := 
Position[# < val & /@ lst, False, 1, 1] == {} 

i

magicFunction4[lst_, val_] := 
Cases[lst, x_ /; x >= val, 1, 1] == {} 

Doing odniesienia znalazłem

In[1]:= data = Table[RandomInteger[{1, 10}], {10000000}]; 

In[2]:= Timing[magicFunction1[data, 10]] 
Out[2]= {0.017551, False} 

In[2]:= Timing[magicFunction2[data, 10]] 
Out[2]= {10.0173, False} 

In[2]:= Timing[magicFunction3[data, 10]] 
Out[2]= {7.10192, False} 

In[2]:= Timing[magicFunction4[data, 10]] 
Out[2]= {0.402562, False} 

Więc moja najlepsza odpowiedź jest magicFunction4, ale nadal nie wiem, dlaczego jest wolniejszy niż magicFunction1. Ignoruję również, dlaczego istnieje tak duża różnica w wydajności między magicFunction3 i magicFunction4.

+1

czas Maxa i twoja funkcja magicFunction4 może wynikać z tego, że Max jest wbudowany .... nie jestem do końca pewny, – Nope

+1

dodatkowy plus za faktyczny pomiar – nes1983

Powiązane problemy