โครงสร้างข้อมูลที่อนุญาตการค้นหาด้วยแท็กที่มีประสิทธิภาพ


11

ฉันกำลังมองหาโครงสร้างข้อมูลที่มีประสิทธิภาพสูงสำหรับการจัดเก็บข้อมูลคล้ายกับต่อไปนี้

แท็ก Id Order1 Order2 
--------------------------
1 1,2 1 1
2 2,5 2 3
3 1,7 4 7
4 6 3 0

ฉันต้องการที่จะสามารถที่จะสอบถามโครงสร้างนี้ในลักษณะดังกล่าวว่าจะให้ฉันรายการรหัสทั้งหมดที่มีการแสดงออกของแท็กต์ - สนับสนุนANDและORและNOTการดำเนินงาน เช่น. ((1 หรือ 2) และไม่ใช่ 7)

ฉันยังต้องสามารถระบุการเรียงลำดับของผลลัพธ์ (Order1 หรือ Order2) และสามารถระบุแถวสูงสุดที่ส่งคืนพร้อมกับออฟเซ็ตเสริม ประสิทธิภาพสำหรับการดึงผลลัพธ์ 30-100 ครั้งแรกคือกุญแจสำคัญ

ในที่สุดฉันต้องการวิธีที่ถูกในการค้นหา "ความสัมพันธ์ของแท็ก" ตัวอย่างเช่นฉันต้องการทราบว่าแท็กใดที่ "เกี่ยวข้อง" กับแท็ก (1 หรือ 2) และในความถี่ใด ความหมายแท็กใดที่ปรากฏในชุดเดียวกันกับ 1 หรือ 2 ... เรียงลำดับตามความถี่

ความคิดใด ๆ ของโครงสร้างข้อมูล (หรือชุดของโครงสร้าง) จะมีประสิทธิภาพสูงสำหรับงานประเภทนี้?

(ฉันต้องการใช้สิ่งนี้เป็นข้อพิสูจน์ถึงแนวคิดในการออกแบบหน้าเว็บที่ติดแท็กของตระกูล SE ของไซต์ใหม่)


1
เพียงแค่แสดงความคิดเห็น (อาจจะเล็กน้อย) ทำไมคุณไม่พึ่งพาระบบการจัดการฐานข้อมูลเชิงสัมพันธ์? คุณสามารถกำหนดตารางด้วย <id, tag> pairs และเพิ่มดัชนีในคอลัมน์แท็ก จากนั้นคุณสามารถใช้แบบสอบถาม SQL มาตรฐานสำหรับการแยกข้อมูล RDBMS จะทำงานอย่างมีประสิทธิภาพ "สกปรก" ของการเพิ่มประสิทธิภาพการสืบค้นและการเรียงลำดับผลลัพธ์
Marzio De Biasi

@Vor การแสดงออกมีประสิทธิภาพในระดับสูงอย่างไม่น่าเชื่อ
Sam Saffron

@ Sam: ตกลง งานของคุณเป็นเรื่องธรรมดาดังนั้นฉันคิดว่า RDBMS ที่ดี (ด้วยเครื่องมือ data mining) สามารถทำงานได้ ฉันปล่อยให้พื้นเป็นผู้เชี่ยวชาญด้านโครงสร้างข้อมูล :-)
Marzio De Biasi

ฉันเชื่อว่าการอนุญาตให้ใช้ทั้ง AND และ OR จะไม่ทำให้การสร้างโครงสร้างข้อมูลที่ไม่ได้แสดงรายการทั้งหมด (อาจจะถูก จำกัด ที่ 3-CNF) หากไม่มีข้อ จำกัด ดังกล่าวอยู่ให้เรียกใช้เรคคอร์ด (ตามลำดับที่ระบุ) จนกว่าคุณจะพบ 30-100 ที่ผ่านข้อกำหนดแท็กของคุณ แม้ว่าโดยทั่วไปแล้วฉันเห็นด้วยกับคำแนะนำของ Vor ในการใช้ฐานข้อมูลเพื่อทำการยกของหนักสำหรับคุณ
bbejot

ไม่ใช่ผู้เชี่ยวชาญ แต่ฉันคิดว่าถ้าคุณไม่มีข้อ จำกัด เกี่ยวกับวิธีที่คุณสามารถถามเกี่ยวกับแท็กมันจะเป็นเรื่องยาก การ จำกัด ให้ CNFs (ตามที่แนะนำโดย bbejot) เป็นวิธีหนึ่งอีกวิธีหนึ่งคือการ จำกัด จำนวนแท็กที่แตกต่างกันซึ่งแบบสอบถามสามารถถามได้ด้วยจำนวนน้อย (พูด 6)
Kaveh

คำตอบ:


6

นี่ไม่ใช่คำตอบที่แน่นอนของโครงสร้างข้อมูลที่มีประสิทธิภาพ แต่เป็นการอธิบายอย่างละเอียดเกี่ยวกับความคิดเห็นของ @bbejot และ @Kaveh ให้เหตุผลในการถกเถียงด้วยมือว่าทำไมคำถามในปัจจุบันจึงไม่ควรคาดหวังสิ่งที่ดีกว่าการค้นหา ฐานข้อมูลทั้งหมด การโต้แย้งขึ้นอยู่กับการลดลงของ SAT, สมมติฐานเวลาเอ็กซ์โปเนนเชียลและการโบกมือเป็นจำนวนมาก

สมมติเรามีไม่เกินแท็กที่แตกต่างกันแล้วเราสามารถคิดของแต่ละ ID ที่ถูกเชื่อมโยงกับ bitvector xของความยาว| x | = nโดยที่x j = 1หากเรามีแท็กj -th และx j = 0 เป็นอย่างอื่น เนื่องจากไม่มีข้อ จำกัด จริง ๆ เกี่ยวกับสิ่งที่ฐานข้อมูลมีลักษณะฉันสามารถสันนิษฐานได้ว่ามันมีรหัส1ถึง2 nกับk -th id ที่มีแท็กเวกเตอร์ที่เกี่ยวข้องของknx|x|=nxJ=1JxJ=012nkkเขียนในไบนารี เขตข้อมูลการสั่งซื้อสามารถโดยพลการเนื่องจากพวกเขาทำให้ปัญหายากขึ้น ทีนี้ถ้าเราได้รับการสอบถามโดยพลการของ , O RและN O T s นี่ก็แค่ถามคำถาม SAT เกี่ยวกับตัวแปรn จากสมมติฐานเวลาเอ็กซ์โปเนนเชียลเราไม่สามารถคาดหวังว่าสิ่งนี้จะเร็วกว่า2 n ... หรือกล่าวอีกนัยหนึ่งเราไม่สามารถคาดหวังว่าสิ่งนี้จะเร็วกว่าการค้นหาฐานข้อมูลทั้งหมดAยังไม่มีข้อความDORยังไม่มีข้อความOTn2n

เราไม่ควรคาดหวังการค้นหาที่มีประสิทธิภาพในความยาวของข้อความค้นหา (โดยลดลงเป็น SAT) เราไม่ควรคาดหวังมากไปกว่าการดูรายการทั้งหมดในฐานข้อมูลด้วยสมมติฐานเวลาเอ็กซ์โปเนนเชียล

เพื่อความหวังสำหรับโครงสร้างข้อมูลที่มีประสิทธิภาพสำหรับคำถามนี้เราจะต้องทำการตั้งสมมติฐานที่ร้ายแรงบางประการเกี่ยวกับโครงสร้างของฐานข้อมูลที่ไม่ได้ทำในคำถามนี้ ตัวอย่างเช่นหากเราถือว่าโครงสร้างพิเศษของข้อความค้นหา (เช่น CNF) เราสามารถหวังได้ว่าจะมีสิ่งที่มีประสิทธิภาพมากขึ้น สมมติฐานทางเลือกอยู่บนโครงสร้างของฐานข้อมูล เราอาจสันนิษฐานได้ว่าได้รับแท็กเพียงส่วนเล็ก ๆ ของแท็กจะปรากฏบน id ที่ได้รับใด ๆ (พูดน้อย1วินาทีลอการิทึม) นี่ไม่ใช่ข้อสันนิษฐานที่ไม่สมเหตุสมผลเนื่องจากการประยุกต์ใช้คำถามที่ติดแท็ก (สิ่งที่ใช้เป็นแท็กหากเกือบทุกแท็กเดียวจะใช้สำหรับคำถาม)n1


การสังเกตที่ดี คำถามแต่ละข้อมีแท็กไม่เกิน 5 แท็กดังนั้นข้อความค้นหาเกี่ยวกับแท็กจะเทียบเท่ากับ 5-CNF
Kaveh

ขอบคุณ! ใช่เราสามารถสมมติ 5-CNF เพิ่มเติมได้ที่นี่พฤติกรรมการติดแท็กไม่ได้สุ่ม โดยทั่วไปคนทั่วไปจะติดแท็กเนื้อหาด้วยแท็กที่พบบ่อยที่สุดดังนั้นจะอนุญาตให้ใช้ทางลัดอื่น ๆ
Sam Saffron

1
@Kaveh พวกเราลงเอยด้วยโครงสร้างหน่วยความจำ มีทางลัดที่ไม่สำคัญอยู่เล็กน้อยเรียงเป็นคอขวดใช้ heap sort หรือ quick sort ที่แก้ไขช่วยให้คุณเลือก N บนได้อย่างมีประสิทธิภาพโดยไม่จำเป็นต้องทำการเรียงแบบเต็ม การคำนวณล่วงหน้าช่วยให้คุณสามารถเลือก pivots ได้อย่างมีประสิทธิภาพมากขึ้นและหลีกเลี่ยงการเรียงลำดับเมื่อจำเป็นต้องใช้การสแกนแบบเต็ม มัลติเธรดเพิ่มความเร็วในการเลือก สามารถเลื่อนการทำงานจำนวนมากไปยังพื้นหลังก่อนที่ผู้ใช้จะโต้ตอบกับโครงสร้าง โครงสร้างในหน่วยความจำของเรานั้นน่าประหลาดใจโดยเฉลี่ย 0 มิลลิวินาทีสำหรับการค้นหาในชุดข้อมูลสแต็คโอเวอร์โฟลว์
Sam Saffron

@SamSaffron - MSO โพสต์รายละเอียดคุณลักษณะนี้อยู่ที่ไหน เราได้มีรายงานข้อผิดพลาดที่นี่
Kevin Vermeer

5

นี่เป็นคำตอบที่ตรงไปตรงมา แต่ฉันคิดว่ามีประสิทธิภาพ:

Map Tag ([Id],[Id])O(ล.โอก.(n))

Map Id (Set Tag)IdO(n* * * *ล.โอก.(ม.))


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