Anda turun dengan ringan, Anda mungkin tidak ingin bekerja untuk hedge fund di mana quants tidak memahami algoritme dasar :-)
Tidak ada cara untuk memproses struktur data berukuran sewenang-wenang O(1)
jika, seperti dalam kasus ini, Anda perlu mengunjungi setiap elemen setidaknya sekali. Yang terbaik yang dapat Anda harapkan adalah O(n)
dalam hal ini, di mana n
panjang senar.
Meskipun, sebagai tambahan, O(n)
algoritme nominal akan digunakan O(1)
untuk ukuran masukan tetap, jadi secara teknis, algoritme tersebut mungkin benar di sini. Namun, biasanya orang tidak menggunakan analisis kompleksitas seperti itu.
Menurut saya, Anda dapat membuat mereka terkesan dalam beberapa cara.
Pertama, dengan memberi tahu mereka bahwa tidak mungkin melakukannya O(1)
, kecuali Anda menggunakan alasan "tersangka" yang diberikan di atas.
Kedua, dengan menunjukkan keahlian elit Anda dengan memberikan kode Pythonic seperti:
inpStr = '123412345123456'
freq = [0] * 1000
for val in [int(inpStr[pos:pos+3]) for pos in range(len(inpStr) - 2)]:
freq[val] += 1
print ([(num, freq[num]) for num in range(1000) if freq[num] > 1])
Output ini:
[(123, 3), (234, 3), (345, 2)]
meskipun Anda dapat, tentu saja, mengubah format keluaran menjadi apapun yang Anda inginkan.
Dan, akhirnya, dengan memberi tahu mereka hampir pasti tidak ada masalah dengan O(n)
solusi, karena kode di atas memberikan hasil untuk string satu juta digit dalam waktu kurang dari setengah detik. Tampaknya skala juga cukup linier, karena string 10.000.000 karakter membutuhkan waktu 3,5 detik dan 100.000.000 karakter membutuhkan waktu 36 detik.
Dan, jika mereka membutuhkan yang lebih baik dari itu, ada cara untuk memparalelkan hal-hal semacam ini yang bisa sangat mempercepatnya.
Tidak dalam satu interpreter Python tentu saja, karena GIL, tetapi Anda dapat membagi string menjadi sesuatu seperti (tumpang tindih yang ditunjukkan oleh vv
diperlukan untuk memungkinkan pemrosesan yang tepat dari area batas):
vv
123412 vv
123451
5123456
Anda dapat mengumpulkan ini untuk pekerja terpisah dan menggabungkan hasilnya setelahnya.
Pemisahan input dan penggabungan output cenderung membanjiri penghematan dengan string kecil (dan mungkin bahkan string jutaan digit) tetapi, untuk kumpulan data yang jauh lebih besar, ini mungkin membuat perbedaan. Mantra saya yang biasa "mengukur, jangan menebak" berlaku di sini, tentu saja.
Mantra ini juga berlaku untuk kemungkinan lain , seperti melewati Python sama sekali dan menggunakan bahasa lain yang mungkin lebih cepat.
Misalnya, kode C berikut, yang berjalan pada perangkat keras yang sama dengan kode Python sebelumnya, menangani seratus juta digit dalam 0,6 detik, kira-kira jumlah waktu yang sama dengan kode Python yang memproses satu juta. Dengan kata lain, jauh lebih cepat:
#include <stdio.h>
#include <string.h>
int main(void) {
static char inpStr[100000000+1];
static int freq[1000];
memset(inpStr, '1', sizeof(inpStr));
inpStr[sizeof(inpStr)-1] = '\0';
if (strlen(inpStr) <= 2) return 0;
int val = (inpStr[0] - '0') * 10 + inpStr[1] - '0';
char *inpPtr = &(inpStr[2]);
while (*inpPtr != '\0') {
val = (val % 100) * 10 + *inpPtr++ - '0';
freq[val]++;
}
for (int i = 0; i < 1000; ++i)
if (freq[i] > 1)
printf("%3d -> %d\n", i, freq[i]);
return 0;
}