求一个关于日期时间间隔计算相关的算法,具体问题如下:
当前有一个比较大(上万个)日期时间的list(时间递增但无规律),假设 dt=[
'2015-01-02 10:21:02',
'2015-01-02 10:21:02'
'2015-01-02 10:21:03'
'2015-01-02 10:21:04'
'2015-01-02 10:21:06'
'2015-01-02 10:21:10'
'2015-01-02 10:21:11'
'2015-01-02 10:21:13'
'2015-01-02 10:22:00'
'2015-01-02 10:22:12'
... ...
]
给定一个时间间隔timeframe(假设4s),现在问题是:求在给定连续时间间隔内,list中最多项数目。
最简单的方法是依次对于list中每个项x,向后查找直至大于timeframe+x的项并统计个数。但由于这个list数量庞大,同时还要涉及时间运算,算法难以达到要求,特来请教!
Beri saya jawapan saya dahulu:
Ingat untuk mengimport
datetime
dantimedelta
untuk kod di atas.Ini ialah pendekatan O(n), n ialah bilangan
timestrs
.Kod itu agak hodoh, saya akan membetulkannya kemudian, tetapi untuk membandingkan kelajuan dan ketepatan, saya telah melakukan beberapa percubaan Berikut ialah kod lengkap yang saya gunakan untuk melakukan eksperimen:
Mengandungi
Penghias yang sangat keren untuk pemasaan:
simpletimer
Dia akan menghias
func
, mencetak masa yang diambil untuk melaksanakanFungsi yang menjana keputusan ujian rawak:
gentimestrs
Ia akan menjana
count
data ujian rentetan masa dan selang masa setiap data ialah integer rawak kurang daripada atau sama dengandelta
Berikut
findmax
danfindmax2
masing-masing adalah pendekatan saya dan pendekatan @citaret (jika anda berminat, anda boleh meniru antara muka dan menambah fungsi anda sendiri, dan penyoal juga boleh menggunakan pendekatan asalnya) Mari bandingkan), dan gunakansimpletimer
mengikut masa.Apabila menguji, mula-mula jana aset ujian, dan kemudian laksanakan fungsi untuk dibandingkan dalam
funclst
Contoh pelaksanaan adalah seperti berikut:
Berikut ialah beberapa keputusan:
Gunakan
timeframe==5
untuk menguji jumlah dana 1000, 10000, 100000Gunakan
timeframe==10
untuk menguji jumlah dana 1000, 10000, 100000Jika saiz jangka masa dikekalkan tidak berubah, kedua-dua masa akan menunjukkan pertumbuhan linear dalam bilangan dana ujian
Tetapi apabila jangka masa berganda, kaedah kedua juga akan mengambil masa dua kali lebih lama
Ini bermakna kerumitan kaedah maksimum @citaret hendaklah O(n * jangka masa)
Perkara lain ialah kadang-kadang hasil kedua-dua kaedah ini tidak sama, akan ada perbezaan Jika penyoal mempunyai kaedah, dia boleh mengesahkan kebenaran
Jawapan yang saya dapati nampaknya betul, tetapi sila betulkan saya jika saya ada membuat sebarang kesilapan. Terima kasih!
Kami juga mengalu-alukan lebih ramai orang untuk membincangkan isu ini.
Soalan yang saya jawab: Python-QA
Tiada data dan tiada profil yang baik Mari berikan versi dahulu untuk melihat sama ada orang lain mempunyai penyelesaian yang lebih baik.
@dokelung mengujinya menggunakan algoritma citaret Untuk senarai dengan jumlah 27505 elemen (diekstrak daripada fail log tunggal dengan 630,000 baris dan diagregatkan daripada berbilang IP sumber), ia mengambil masa 3.8842415850296845s . Pada masa yang sama, ia membantu saya mendapati bahawa masalah kecekapan yang lebih serius sebenarnya adalah pengekstrakan garis log yang memenuhi keperluan dalam fungsi Terima kasih atas jawapan dan penyertaan anda, terima kasih!