อัลกอริทึมสำหรับ 'k' 'ตัวเลขที่เกิดขึ้นบ่อยที่สุด


19

ฉันค้นหาอัลกอริธึมที่มีประสิทธิภาพมากที่สุด (การสตรีมมิ่ง ??) ที่บอกองค์ประกอบที่เกิดขึ้นบ่อยที่สุด 'k' ในสตรีมข้อมูล ณ จุดใดก็ได้ โพสต์นี้: อัลกอริทึมสตรีมข้อมูล "หารและพิชิต"ทำให้ฉันสนใจ

ตัวอย่างเช่นสมมติว่ามีตัวเลข: (4,3,5,1,6,2,4,3,8,9,1) และฉันค้นหาหมายเลข 3 ที่เกิดขึ้นบ่อยที่สุด (พูด) แล้วฉันควร รับ (3,4,1) เป็นคำตอบ

ฉันพยายามค้นหาออนไลน์ แต่ไม่สามารถหาสถานที่ที่ให้แนวทางและบอกว่าดีที่สุด วิธีแก้ปัญหาเล็ก ๆ น้อย ๆ ก็คือการใช้กองหรือต้นไม้ไบนารีแบบสมดุล แต่ฉันคิดว่ามันมีวิธีที่ดีกว่าและฉันอยากรู้ว่ามันมีการบันทึกไว้ที่ใดที่หนึ่งหรือไม่

แก้ไข: ฉันกำลังมองหาอัลกอริทึมที่ให้คำตอบที่ถูกต้องเสมอเมื่อเทียบกับอัลกอริธึม appromixation (ซึ่งหลายอันปรากฏขึ้นในผลการค้นหา) ซึ่งขึ้นอยู่กับการกระจายของข้อมูลไม่ทางใดก็ทางหนึ่ง


อันที่จริงมีอัลกอริธึมสามชนิด: แน่นอนประมาณและ "ขึ้นอยู่กับข้อมูล" คุณจัดการประเภทสุดท้าย แต่มีอัลกอริทึมโดยประมาณที่ไม่ขึ้นอยู่กับการกระจายข้อมูลที่อนุญาตหรือไม่ อย่างที่ฉันระบุไว้หากไม่แสดงว่าคุณกำลังมีปัญหาเพราะมีข้อ จำกัด ด้านล่างสำหรับปัญหานี้ในการตั้งค่าสตรีม
Suresh Venkat

1
ฉันสงสัยว่าอัลกอริทึมที่ใช้หน่วยความจำที่ จำกัด (อัลกอริทึมการสตรีม) สามารถทำสิ่งที่ฉันต้องการได้จริงหรือไม่และดูเหมือนว่าพวกเขาไม่สามารถทำได้ตามที่คุณได้ชี้ให้เห็น นอกจากนี้ไม่ทราบว่าอัลกอริทึมที่แน่นอนแบบไม่สตรีมเป็นที่รู้จักซึ่งแก้ปัญหาใน O (n) รับประกันเวลากรณีที่เลวร้ายที่สุดซึ่งกล่าวถึงที่นี่ (อ้างถึงโดยกระดาษโดย Cormode และ Hadjileftheriou จากลิงก์ที่คุณให้ไว้): citeseerx.ist.psu edu / viewdoc / summary? doi = 10.1.1.106.7889
dhruvbird

คำตอบ:


20

k=1โอ(n)

n/k

kk


1
+1 ฉันคิดว่า> 50% ของอัลกอริธึมเวลาเป็นที่รู้จักกันดี (อัลกอริธึมองค์ประกอบส่วนใหญ่) ตามที่คุณกล่าวถึง
dhruvbird

2
ขอบคุณ !! บทความโดย Cormode และ Hadjileftheriou ที่คุณกล่าวถึงอ้างอิงบทความนี้: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.106.7889ซึ่งมีเทคนิคแบบเดียวกับที่ฉันคิด มันเก็บไว้ 2 รายการที่เชื่อมโยง; ทีละความถี่และภายในรายการอื่นขององค์ประกอบทั้งหมดที่มีความถี่เดียวกัน
dhruvbird

คุณสามารถอธิบายอย่างละเอียดเกี่ยวกับอัลกอริทึมมากกว่า 50 เปอร์เซ็นต์ได้ไหม และตัวต่อ google? ฉันไม่สามารถทำตามเหตุผลที่เลอะเทอะนี้เนื่องจากคุณเพิ่งแตะมันและไม่ได้ใช้อย่างเต็มที่กับ "เคล็ดลับที่รู้จักกันดี" ขอบคุณ


นี่คือความคิดเห็น (มีชื่อเสียงไม่เพียงพอ) ในลิงก์ของ Suresh Venkat userweb.cs.utexas.edu/users/misra/scannedPdf.dir/ … : ดูเหมือนว่าอัลกอริทึมที่นำเสนอต้องใช้การส่งผ่านข้อมูลครั้งที่สองซึ่งไม่ได้รับอนุญาต ที่นี่ ในความเป็นจริงฉันไม่เห็นว่าอัลกอริทึมแบบ one-pass ที่มีความต้องการพื้นที่ O (1) มีอยู่ได้อย่างไร
TonyK

2

ฉันยังแนะนำให้อ่านหัวข้อ 8.1.3 "การขุดแบบบ่อย ๆ ใน Data Streams" ของหนังสือต่อไปนี้:

Jiawei Han, Micheline Kamber การทำเหมืองข้อมูล --- แนวคิดและเทคนิคฉบับที่สองสำนักพิมพ์มอร์แกนคอฟแมนน์ 2549

แนะนำอัลกอริทึมที่รู้จักกันในชื่อLossy Countingซึ่งใกล้เคียงกับรายการที่พบบ่อย (รายการที่มีการสนับสนุนสูงกว่าmin_support ) ด้วยความแม่นยำโดยพลการ

ไม่ใช่สิ่งที่คุณต้องการ แต่ฉันคิดว่ามันอาจช่วยได้


บางทีคุณสามารถช่วยฉันตอบคำถามของฉันได้ที่นี่
Ben
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.