Selama wawancara untuk posisi pengembang Java, saya ditanya hal berikut:
Tulis fungsi yang membutuhkan dua params:
- String yang mewakili dokumen teks dan
- bilangan bulat yang menyediakan jumlah item untuk dikembalikan.
Menerapkan fungsi sedemikian rupa sehingga mengembalikan daftar String yang dipesan berdasarkan frekuensi kata, kata yang paling sering muncul terlebih dahulu. Solusi Anda harus dijalankan dalam waktu di mana adalah jumlah karakter dalam dokumen.n
Berikut ini adalah apa yang saya jawab (dalam pseudocode), ini bukan melainkan waktu karena jenisnya. Saya tidak tahu bagaimana melakukannya waktu. O ( n log n ) O ( n )
wordFrequencyMap = new HashMap<String, Integer>();
words = inputString.split(' ');
for (String word : words) {
count = wordFrequencyMap.get(word);
count = (count == null) ? 1 : ++count;
wordFrequencyMap.put(word, count);
}
return wordFrequencyMap.sortByValue.keys
Apakah ada yang tahu atau ada yang bisa memberi saya petunjuk?
algorithms
sorting
strings
data-mining
pengguna2712937
sumber
sumber
Hashtable
Java warisan atau tidak benar-benar tidak relevan untuk tujuan situs ini.Jawaban:
Saya menyarankan variasi penghitungan distribusi:
maxWordCound
. -maxWordCount
. Jenis entri adalah daftar string. - , karena hitungannya tidak boleh lebih tinggi.Anda mungkin dapat mengganti trie dengan struktur data lain di fase pertama.
sumber
Pengumpulan jumlah kejadian adalah O (n), jadi triknya adalah hanya menemukan jumlah kejadian teratas.
Heap adalah cara umum untuk mengagregasi nilai k teratas, walaupun metode lain dapat digunakan (lihat https://en.wikipedia.org/wiki/Partial_sorting ).
Dengan asumsi k adalah param kedua di atas, dan itu adalah konstanta dalam pernyataan masalah (tampaknya):
Karena ukuran heap adalah konstan, operasi heap adalah O (1), jadi langkah 3 adalah O (n).
Tumpukan juga dapat dipertahankan secara dinamis saat membangun trie.
sumber
Yang berikut salah ; Saya meninggalkannya di sini untuk sementara waktu untuk tujuan ilustrasi.
Bangun pohon sufiks teks, misalnya dengan algoritma Ukkonen .
Jika konstruksi belum melakukan ini, tambahkan jumlah daun yang dapat dijangkau ke setiap simpul (bagian dalam).
Lintasi pohon dari akar dan potong semua cabang di ruang pertama (putih).
Lintasi pohon dan urutkan daftar anak-anak dari setiap simpul berdasarkan jumlah daunnya.
Hasil pohon (daun dari kiri ke kanan) sekarang daftar semua kata, diurutkan berdasarkan frekuensi.
Mengenai runtime:
Batas yang lebih tepat dapat diperoleh dengan parametrising runtime dengan jumlah kata yang berbeda; jika ada sedikit, pohon itu kecil setelah 2.
sumber
HashMap
sumber
Solusi berbasis Hashtable
Asumsinya adalah bahwa algoritma hashing adalah linear dalam waktu dalam kaitannya dengan jumlah karakter.
Solusi berbasis radix
Beberapa kata terpanjang teratas dalam bahasa Inggris panjangnya sangat panjang , tetapi kemudian seseorang dapat membatasi panjang kata pada angka yang masuk akal (misalnya 30 atau lebih kecil) dan memotong kata-kata yang menerima margin kesalahan yang mungkin menyertainya.
sumber