Sådan besvares Data Science Interview Coding-spørgsmål?

Der er i øjeblikket over 1.829 åbne Machine Learning Engineering-positioner på LinkedIn.

Ser man på tendensen i de sidste par år omkring ansættelse af Data Scientists, bliver det i stigende grad tydeligt, at Data Scientists ikke kun analyserer data og bygger modeller, men de programmerer også til at implementere algoritmerne i skala. Datateknik er et vigtigt aspekt af en datavidenskabers daglige liv. Som data-videnskabsmand er alle i dag på udkig efter Machine Learning-ekspertise, som involverer en ret lidt kodning. På Acing AI har jeg arbejdet hårdt for at hjælpe Data Scientists med at komme ind i Data Science roller. Alle tech-virksomheder, der ansætter i dag til denne stilling, begynder normalt med en kodningstest. Denne artikel har til formål at give en tilgang til at besvare kodningsspørgsmål, der stilles under et datavidenskabsinterview eller kodningstesten.

Intervieweren giver et problem og vil se, hvordan du kommer til løsningen. Evne til at løse problemer er også ved test her. Den tilgang, som interviewpersonen tager for at finde en løsning på problemet, er lige så vigtig som selve løsningen. Derfor er direkte hoppe til den fineste løsning muligvis ikke den bedste metode. Lad os forstå fremgangsmåden til at besvare kodningsspørgsmål ved at gennemgå en trinvis løsning. Nedenstående spørgsmål er blevet stillet i mange Data Science Coding-interviews før.

Foto af Adi Goldstein på Unsplash

Givet en række heltal, returnerer indekser for de to tal, således at de tilføjer et specifikt mål.

Du antager muligvis, at hver input vil have nøjagtigt en løsning, og du bruger muligvis ikke det samme element to gange.

Eksempel: Givet numre = [2, 7, 11, 15], mål = 18,

nums [1] + nums [2] = 7+ 11 = 18, returner [1, 2].

En god måde at besvare et kodningsspørgsmål er at starte med en Brute Force-løsning, der giver en uoptimeret ydelse. I løbet af interviewet forventer intervieweren, at den interviewede optimerer løsningen ved at tænke på andre løsninger.

Lad os tage den samme tilgang til at finde en løsning.

Brute force-tilgang:

Brute force-tilgang ville være at have to For loops. Den første For-sløjfe, vi sløjfer fra det første element til det sidste element i matrixen, mens det andet For-løkken vi løkker fra det andet element til det sidste i arrayet. Så prøver vi bare at finde elementerne ved at trække dem fra målet.

public int [] twoSumBruteForce (int [] numre, int target) {
   for (int i = 0; i 

Kompleksitetsanalyse

  • Tidskompleksitet: O (n²). For hvert element forsøger vi at finde dets komplement ved at gå gennem resten af ​​matrixen, hvilket tager O (n) tid. Derfor er tidskompleksiteten O (n²).
  • Rumkompleksitet: O (1).

Optimering:

Vores tidskompleksitet skal forbedres. Tidskompleksiteten er dårlig i dette tilfælde, da vi går to gange gennem løkken. På dette tidspunkt bør vi tænke på datastrukturer, der vil reducere opslaget af elementerne. Lad os overveje at bruge en Hash-tabel som tiden til at slå et element op i Hash-tabellen O (1) for det meste. Hvis der var en kollision, ville opslagstiden gå til O (n), men opslag til hash-tabellen skulle amortiseres til O (1) -tid, så længe hash-funktionen blev valgt omhyggeligt.

En måde at bruge hash-tabellen er at gemme elementerne i hashmap indekseret med deres array-indeks. Derefter ved hjælp af en For-loop kan vi slå op, hvis hvert enkelt element komplement (mål-elementværdi) findes. Dette ville være O (n), da vi gennemgår elementerne to gange, én gang, mens vi tilføjer dem til tabellen og for det andet, mens vi får komplementet. Dette kræver to pas. Lad os tage et skridt videre for at optimere, at der kun er et pass. Vi kan iterere og indsætte elementer i tabellen og på samme tid også se tilbage for at kontrollere, om det aktuelle elements komplement allerede findes i tabellen. Hvis den findes, returnerer vi værdien.

public int [] twoSum (int [] tal, int target) {
     Kort  kort = nyt HashMap <> ();
        for (int i = 0; i 

Kompleksitetsanalyse:

  • Tidskompleksitet: O (n). Vi krydser listen, der indeholder n elementer, kun én gang. Hver opslag i tabellen koster kun O (1) tid.
  • Rumkompleksitet: O (n). Den ekstra plads, der kræves, afhænger af antallet af poster, der er gemt i hashtabellen, og som gemmer højst n elementer.

Fra dette eksempel ser vi, at vi har handlet tidskompleksitet fra O (n²) til O (n) for at øge rumkompleksiteten fra O (1) til O (n). For enhver algoritme, der udfører data, skal sådanne kompromiser redegøres for. I Data Science-verdenen er det helt op til den person, der bygger modellen for at optimere GPU'erne mod tiden. GPU'er har en omkostningsværdi forbundet med dem. Så det er vigtigt at have et tids-omkostningsforhold, som er optimalt. I de fleste situationer er tiden altid optimeret, men der er scenarier, hvor vi ikke kan have uendelige GPU'er, eller at tilføjelse af flere GPU'er ikke drastisk reducerer tiden. En forsigtig dataforsker vil altid se, hvad der er tilgængeligt, og afbalancere denne kompromis mellem tid og omkostninger.

Tak for at have læst! Hvis du nød det, skal du teste, hvor mange gange kan du ramme på 5 sekunder. Det er fantastisk cardio til dine fingre OG vil hjælpe andre mennesker med at se historien.

Den eneste motivation for denne blogartikel er at give svar på nogle Data Science Interview-spørgsmål. Jeg sigter mod at gøre dette til et levende dokument, så alle opdateringer og foreslåede ændringer altid kan inkluderes. Giv relevant feedback.

Denne historie er offentliggjort i The Startup, Medium's største iværksætterpublikation efterfulgt af +412.714 mennesker.

Abonner for at modtage vores tophistorier her.