การปรับแต่งโค้ดใน Java
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
ตอนนี้เรารู้จัก space complexity และ time complexity แล้ว!
จะนำความเข้าใจนี้ไปเขียนโค้ดให้มีประสิทธิภาพยิ่งขึ้นได้อย่างไร?
ด้วยการเลือกโครงสร้างข้อมูลที่เหมาะสม!
กำลังสร้างระบบจัดการผู้ใช้
ต้องตรวจสอบว่าชื่อผู้ใช้ที่กำหนด มีอยู่จริง หรือไม่
ใช้ list: ความซับซ้อน $O(n)$
public boolean usernameExists(ArrayList<String> users, String newUsername) {
for (String username : users) {
if (username.equals(newUsername)) {
return true;
}
}
return false;
}
โซลูชันระบบจัดการผู้ใช้ที่ปรับปรุงแล้ว:
public class UserRegistry {
private HashSet<String> users = new HashSet<>();
public boolean userExists(String username) {
return users.contains(username); // O(1) average time
}
}
HashMap: ความซับซ้อนเฉลี่ย $O(1)$ สำหรับการดำเนินการpublic class UserCache {
private HashMap<String, UserProfile> userProfiles = new HashMap<>();
public UserProfile getUser(String username) {
return userProfiles.get(username); // O(1) average time
}
}
hashCode()ArrayList เราไม่รู้ index ของชื่อผู้ใช้ที่ต้องการค้นหาhashcode() เราสามารถแปลงออบเจ็กต์เป็น index ที่ใช้ค้นหาได้pavlos.2020 -> 35189
HashMap และ HashSet มี array อยู่เบื้องหลังhashCode() บนสมาชิกนั้นเพื่อได้ค่าจำนวนเต็มตัวอย่าง:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
"optimizingCodeInJava" -> 1406313774 // Implemented by Java
1406313774 % 16 = 14 <- that's our bucket!
LinkedList สำหรับ bucket นั้นการเลือกโครงสร้างข้อมูลก็เหมือนการเลือกเครื่องมือให้เหมาะกับงาน - ค้อน (ArrayList) เหมาะกับตะปู แต่ใช้ไม่ได้ผลกับสกรู (ซึ่ง Set อาจเหมาะกว่า)

การปรับแต่งโค้ดใน Java