ฉันต้องการค้นหาดัชนีของชุดอย่างมีประสิทธิภาพ ฉันใช้ unordered_map และสร้างแผนที่ผกผันเช่นนี้
std::unordered_map <int, int> myHash (size);
Int i = 0;
for (it = someSet.begin(); it != someSet.end(); it++)
{
myHash.insert({*it , i++});
}
มันใช้งานได้แต่มันไม่มีประสิทธิภาพ ฉันทำสิ่งนี้ทุกครั้งที่ต้องการดัชนีที่ฉันสามารถเข้าถึงได้ O(1) การวิเคราะห์ประสิทธิภาพแสดงให้ฉันเห็นว่าส่วนนี้กลายเป็นฮอตสปอตของโค้ดของฉัน
VTune บอกฉันว่าตัวดำเนินการ new
คือฮอตสปอตของฉัน ฉันเดาว่ามีบางอย่างเกิดขึ้นภายใน unordered_map สำหรับฉันดูเหมือนว่าคดีนี้ควรได้รับการจัดการอย่างมีประสิทธิภาพ ฉันยังหาวิธีที่ดีไม่ได้เลย มีวิธีแก้ไขที่ดีกว่านี้หรือไม่? ตัวสร้างที่ถูกต้อง? บางทีฉันควรส่งข้อมูลเพิ่มเติมไปให้ตัวสร้าง ฉันค้นหารายการเริ่มต้นแล้ว แต่มันไม่ใช่สิ่งที่ฉันต้องการเลย
อัปเดต: ให้ฉันเพิ่มข้อมูลเพิ่มเติม ฉากนี้ไม่สำคัญเท่าไหร่ ฉันบันทึกชุดลงในอาร์เรย์ (เรียงลำดับ) ต่อมาฉันต้องค้นหาดัชนีของค่าที่ไม่ซ้ำใคร ฉันสามารถทำได้ในการเข้าสู่ระบบแต่มันไม่เร็วพอ นี่คือเหตุผลที่ฉันตัดสินใจใช้แฮช ขนาดของเซต (คอลัมน์ของเมทริกซ์ย่อย) จะไม่เปลี่ยนแปลงหลังจากจุดนี้
มันเกิดขึ้นจากการคำนวณเมทริกซ์แบบกระจาย ซึ่งฉันต้องค้นหาดัชนีของเมทริกซ์ย่อยในเมทริกซ์ที่ใหญ่กว่า ดังนั้นขนาดและรูปแบบของการค้นหาจึงขึ้นอยู่กับเมทริกซ์อินพุต มันใช้งานได้สมเหตุสมผลกับปัญหาเล็กๆ น้อยๆ ฉันสามารถใช้ตารางการค้นหาได้ แต่ในขณะที่ฉันกำลังวางแผนที่จะทำแบบคู่ขนาน ตารางการค้นหาสำหรับแต่ละเธรดอาจมีราคาแพง ฉันมีขนาดแฮชที่แน่นอนในเวลาที่สร้าง ฉันคิดว่าการส่งมันไปที่ตัวสร้างจะหยุดการจัดสรรใหม่ ฉันไม่เข้าใจจริงๆ ว่าทำไมมันถึงจัดสรรมากขนาดนี้
Int
? คุณหมายถึงint
? - person tadman   schedule 31.10.2020std::distance()
คือ O(n) - person Eugene   schedule 31.10.2020std::distance()
คุณจะใช้ดัชนีที่ไหนอีก - person Eugene   schedule 31.10.2020pmr
สำหรับการจัดสรรในunordered_map
หากคุณเพียงแค่เพิ่มองค์ประกอบ บางทีคุณอาจจองจำนวนมากและใส่องค์ประกอบต่างๆ ลงไป - person ALX23z   schedule 31.10.2020SomeSet
เขาบอกว่าเขาเก็บดัชนีของ อาร์เรย์ - person ALX23z   schedule 31.10.2020