AMAZON Wywiad Pytanie

Podano N tablic o rozmiarze K każda.. każdy z tych elementów K w tablicach N jest posortowany, każdy z tych elementów N * K jest unikalny. Wybierz pojedynczy element z każdej z N tablic, z wybranego podzbioru N elementów. Odjąć minimalny i maksymalny element. Teraz, to różnica powinna być jak najmniejsza.. Mam nadzieję, że problem jest jasny :):)

Próbka:

N=3, K=3

N=1 : 6, 16, 67
N=2 : 11,17,68
N=3 : 10, 15, 100

Tutaj, jeśli wybrano 16, 17, 15.. otrzymujemy minimalną różnicę jako 17-15=2.

 19
Author: Sachin Shanbhag, 2011-05-23

7 answers

Myślę O O (N * K * N) (edytowane po poprawnym wskazaniu przez zivo, teraz nie jest to dobre rozwiązanie: () rozwiązanie.
1. Weź N wskaźnik początkowo wskazujący na początkowy element każdej z N tablic.

6, 16, 67
^ 
11,17,68
^
10, 15, 100
^ 

2. Znajdź najwyższy i najniższy element spośród bieżącego wskaźnika O(k) (6 i 11) i znajdź różnicę między nimi.(5)
3. Zwiększ wskaźnik wskazujący na najniższy element o 1 w tej tablicy.

 6, 16, 67
    ^ 
 11,17,68
 ^
 10, 15, 100 (difference:5)
 ^ 

4. Powtarzaj Krok 2 i 3 i zachowaj minimum różnica.

 6, 16, 67
    ^ 
 11,17,68
 ^
 10,15,100 (difference:5)
    ^ 


 6, 16, 67
    ^ 
 11,17,68
    ^
 10,15,100 (difference:2)
    ^ 

Powyżej będzie wymagane rozwiązanie.

 6, 16, 67
    ^ 
 11,17,68
    ^
 10,15,100 (difference:84)
       ^ 

 6, 16, 67
        ^ 
 11,17,68
    ^
 10,15,100 (difference:83)
       ^ 

I tak dalej......

EDIT:

Jego złożoność może być zmniejszona za pomocą sterty (zgodnie z sugestią Uri). Pomyślałem o tym, ale napotkałem problem: za każdym razem, gdy element jest wydobywany ze sterty, jego numer tablicy musi być znaleziony, aby zwiększyć odpowiedni wskaźnik dla tej tablicy. skuteczny sposób na znalezienie numeru tablicy może zdecydowanie zmniejszyć złożoność do O(K * N log (K * N)) . Jednym z naiwnych sposobów jest użycie takiej struktury danych

Struct
{
    int element;
    int arraynumer;
}

I odtworzyć początkowe dane jak

 6|0,16|0,67|0

 11|1,17|1,68|1

 10|2,15|2,100|2

Początkowo Zachowaj aktualny max dla pierwszej kolumny i wstaw spiczaste elementy w stercie. Teraz za każdym razem, gdy element jest ekstrahowany, jego numer tablicy może być znaleziony, wskaźnik w tej tablicy jest zwiększany, nowo spiczasty element może być porównany z bieżącym max i wskaźnik max może być odpowiednio dopasowany.

 9
Author: Terminal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 16:37:19

Oto algorytm do rozwiązania tego problemu w dwóch krokach:

Pierwszym krokiem jest połączenie wszystkich tablic w jedną posortowaną tablicę, która wyglądałaby tak:

Combined_val [] - który zawiera wszystkie liczby
combined_ind [] - która przechowuje indeks, do której tablicy pierwotnie należała ta liczba

Ten krok można łatwo zrobić w O(K*N*log (N)), ale myślę, że możesz zrobić lepiej niż to zbyt (może nie, można wyszukać warianty sortowania scalonego, ponieważ robią krok podobny do tego)

Teraz drugi krok:

Łatwiej jest po prostu umieścić kod zamiast wyjaśniać, więc tutaj jest pseduocode:


int count[N] = { 0 }
int head = 0;
int diffcnt = 0;
// mindiff is initialized to overall maximum value - overall minimum value
int mindiff = combined_val[N * K - 1] - combined_val[0];
for (int i = 0; i &lt N * K; i++) 
{
  count[combined_ind[i]]++;

  if (count[combined_ind[i]] == 1) {
    // diffcnt counts how many arrays have at least one element between
    // indexes of "head" and "i". Once diffcnt reaches N it will stay N and
    // not increase anymore
    diffcnt++;
  } else {
    while (count[combined_ind[head]] > 1) {
      // We try to move head index as forward as possible while keeping diffcnt constant.
      // i.e. if count[combined_ind[head]] is 1, then if we would move head forward
      // diffcnt would decrease, that is something we dont want to do.
      count[combined_ind[head]]--;
      head++;
    }
  }

  if (diffcnt == N) {
    // i.e. we got at least one element from all arrays
    if (combined_val[i] - combined_val[head] &lt mindiff) {
      mindiff = combined_val[i] - combined_val[head];
      // if you want to save actual numbers too, you can save this (i.e. i and head
      // and then extract data from that)
    }
  }
}

Wynik jest w mindiff.

Czas trwania drugiego kroku wynosi O (N * K). Dzieje się tak dlatego, że indeks "head" przesunie się maksymalnie O N*K razy. tak więc wewnętrzna pętla nie czyni tego kwadratowego, jest nadal liniowa.

Więc całkowity czas działania algorytmu wynosi O( N * K * log(N)), jednak jest to spowodowane krokiem scalania, jeśli można wymyślić lepsze krok scalania możesz prawdopodobnie sprowadzić go do O ( N * K).

 3
Author: zviadm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 18:42:41

Ten problem jest dla menedżerów

Masz 3 programistów (N1), 3 testerów (N2) i 3 DBAs (N3) Wybierz mniej rozbieżny zespół, który może pomyślnie uruchomić projekt.

int[n] result;// where result[i] keeps the element from bucket N_i

int[n] latest;//where latest[i] keeps the latest element visited from bucket N_i

Iterate elements in (N_1 + N_2 + N_3) in sorted order
{
    Keep track of latest element visited from each bucket N_i by updating 'latest' array;

    if boundary(latest) < boundary(result)
    {
       result = latest;
    }
}

int boundary(int[] array)
{
   return Max(array) - Min(array);
}
 3
Author: random,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-25 00:03:09

Mam O (K*N * log (K)), z typowym wykonaniem znacznie mniej. Obecnie nie może myśleć nic lepszego. Wyjaśnię najpierw łatwiejsze do opisania (nieco dłuższe wykonanie):

  1. dla każdego elementu f w pierwszej tablicy (Pętla przez elementy K)
  2. dla każdej tablicy, począwszy od drugiej tablicy (Pętla przez N-1 tablic)
  3. Wykonaj wyszukiwanie binarne na tablicy i znajdź element najbliższy f. jest to twój element(Log (K))

Algorytm ten można zoptymalizować, jeśli dla każda tablica dodaje nowy indeks podłogi. Podczas przeszukiwania binarnego Szukaj między 'Floor' A 'K-1'. Początkowo indeks podłogi wynosi 0, a dla pierwszego elementu przeszukujemy całe tablice. Gdy znajdziesz element najbliższy 'f', zaktualizuj indeks podłogi o Indeks tego elementu. Gorsze przypadki są takie same (Floor może nie aktualizować, jeśli maksymalny element pierwszej tablicy jest mniejszy niż jakiekolwiek inne minimum), ale średnia wielkość liter poprawi się.

 1
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 08:12:04

Dowód poprawności zaakceptowanej odpowiedzi (rozwiązanie Terminala)

Załóżmy, że algorytm znajduje szereg A= co nie jest optymalnym rozwiązaniem (R).

Rozważmy indeks j W R, taki, że pozycja R [j] jest pierwszą pozycją spośród r, którą algorytm bada i zastępuje ją następnym elementem w swoim wierszu.

Niech A ' oznacza rozwiązanie kandydata na tym etapie (przed zastąpieniem). Ponieważ R [j]=A '[j] jest minimalną wartością A', jest również minimum R. Teraz rozważmy maksymalną wartość R, R[M]. Jeśli A '[m]

 1
Author: Eyal Schneider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-28 15:52:07

Dla każdego elementu w 1. tablicy

    choose the element in 2nd array that is closest to the element in 1st array
    current_array = 2;
    do
    {
        choose the element in current_array+1 that is closest to the element in current_array
        current_array++;
    } while(current_array < n);

Złożoność: O (k^2 * n)

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-28 15:05:26

Oto moja logika, jak rozwiązać ten problem, pamiętając, że musimy wybrać jeden element z każdej tablicy N (aby obliczyć najmniejsze minimum)

// if we take the above values as an example!
// then the idea would be to sort all three arrays while keeping another
// array to keep the reference to their sets (1 or 2 or 3, could be 
// extended to n sets)      
1   3   2   3   1   2   1   2   3    // this is the array that holds the set index
6   10  11  15  16  17  67  68  100  // this is the sorted combined array.
           |           |   
    5            2          33       // this is the computed least minimum,
                                     // the rule is to make sure the indexes of the values 
                                     // we are comparing are different (to make sure we are 
// comparing elements from different sets), then for example
// the first element of that example is index:1|value:6 we hold 
// that value 6 (that is the value we will be using to compute the least minimum, 
// then we go to the edge of the comparison which would be the second different index, 
// we skip index:3|value:10 (we remove it from the array) we compare index:2|value:11 
// to index:1|value:6 we obtain 5 which would go to a variable named leastMinimum = 5, 
// now we remove the indexes and values we already used,
// and redo the same steps.

Krok 1:

1   3   2   3   1   2   1   2   3
6   10  11  15  16  17  67  68  100
           |   
5            
leastMinumum = 5

Krok 2:

3   1   2   1   2   3
15  16  17  67  68  100
           |   
 2          
leastMinimum = min(2, leastMinumum) // which is equal 2

Krok 3:

1   2   3
67  68  100

    33
leastMinimum = min(33, leastMinumum) // which is equal to old leastMinumum which is 2

Teraz: Zakładamy, że mamy elementy z tej samej tablicy, które są bardzo blisko siebie (k = 2 Tym razem, co oznacza, że mamy tylko 3 zbiory o dwóch wartościach) :

// After sorting the n arrays we will have the below indexes array and values array
1   1   2   3   2   3
6   7   8   12  15  16
*       *   *

* we skip second index of 1|7 and we take the least minimum of 1|6 and 3|12 (index:2|value:8 will be removed as it is not at the edges, we pick the minimum and maximum of the unique index subset of n elements)
1   3         
6   12
 =6
* second step we remove the values we already used, so the array become like below:

1   2   3
7   15  16
*   *   * 
7 - 16
= 9

Uwaga: Inne podejście, które zużywa więcej pamięci, polegałoby na tworzeniu N pod-tablic, z których porównywalibyśmy maksimum-minumum

Tak więc z poniższej posortowanej tablicy wartości i odpowiadającej jej tablicy indeksów wyodrębniamy trzy inne tablice podrzędne:

1   3   2   3   1   2   1   2   3
6   10  11  15  16  17  67  68  100

Pierwsza Tablica:

1   3   2 
6   10  11

11-6 = 5

Druga Tablica:

3   1   2
15  15  17

17-15 = 2

trzeci Array:

1   2   3
67  68  100

100 - 67 = 33

 0
Author: Mehdi Karamosly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-13 20:35:46