Menghitung jumlah penjumlahan dari sub-array yang berdekatan dari suatu array

12

Kita diberi array dengan semua a [ i ] > 0 .a[1n]a[i]>0

Sekarang kita perlu menemukan berapa banyak jumlah yang berbeda dapat dibentuk dari subarrays nya (di mana subarray adalah berbagai bersebelahan dari array, yaitu, untuk beberapa j , k , jumlahnya adalah jumlah dari semua elemen dari subarray). Misalnya, jika a = [ 1 , 2 , 1 ] , maka jawabannya adalah 4: kita dapat membentuk 1 , 2 , 3 , 4 .a[jk]j,ka=[1,2,1]1,2,3,4

Saya tahu bagaimana cara menghitung jumlah jumlah yang berbeda dalam waktu .O(n2)

Selain itu, saya menyadari bahwa ini mirip dengan masalah klasik di mana kita perlu menemukan jumlah substring yang berbeda dari sebuah string. Saya sedang memikirkan kemungkinan membangun susunan sufiks dan menyelesaikannya dengan cara yang serupa (dalam waktu ). Tetapi saya belum dapat menemukan cara untuk memodifikasinya agar berfungsi di sini. Sebagai contoh, jika kita menggunakan array suffix untuk a = [ 1 , 2 , 1 ] kita akan mendapatkan 5 case daripada empat yang dapat diterima. Apakah ini mungkin dilakukan dengan menggunakan array sufiks atau saya berpikir ke arah yang salah?O(n)a=[1,2,1]

Juga ada satu arah lagi yang saya pikirkan. Membagi dan menaklukkan. Seperti jika saya membagi array menjadi dua bagian setiap kali sampai dikurangi menjadi satu elemen. Satu elemen dapat memiliki satu jumlah. Sekarang jika kita menggabungkan dua elemen tunggal, itu dapat dilakukan dengan dua cara: jika kedua rentang tunggal memiliki elemen yang sama maka kita mendapatkan 2 jumlah yang berbeda, atau jika keduanya memiliki elemen yang berbeda kita mendapatkan 3 jumlah yang berbeda. Tetapi saya tidak dapat menggeneralisasi ini untuk menggabungkan array dengan panjang lebih besar dari 1. Apakah mungkin untuk menggabungkan dua array ukuran m dan mendapatkan jawabannya dalam ?O(m)

Salena
sumber
O(n lg n)
Saya akan menyarankan mulai dengan masalah berikut: seberapa sulit untuk memutuskan apakah ada dua interval dengan jumlah yang sama? Sangat menggoda untuk membuktikan 3SUM-hardness dari masalah ini, tapi sejauh ini saya belum bisa.
Yuval Filmus

Jawaban:

2

O(n2)Θ(n2)

[1,2,4,8,,2n]n(n+1)2


"Hampir pasti" disebabkan oleh kenyataan bahwa masalahnya tidak memerlukan nilai jumlah sebagai output. Namun, saya tidak berpikir duplikat dapat dihindari tanpa menentukan setidaknya sebagian besar nilai.

FrankW
sumber
Saya tidak melihat alasan khusus mengapa seharusnya tidak ada cara untuk menghindari semua kemungkinan sambil tetap memberikan jawaban yang benar. Algoritma pemrograman dinamis melakukannya secara rutin.
Yuval Filmus