Tôi đã được đưa ra một vấn đề để giải quyết trong O(n)
độ phức tạp về thời gian:Độ phức tạp của HashMap.containsValue() trong java là bao nhiêu?
"Cho danh sách số và số x. Tìm xem có 2 số nào trong danh sách thêm vào x không?"
Và đây là giải pháp của tôi:
public class SumMatchResult {
public static void main(String[] args){
int[] numberList = {6,1,8,7,4,6};
int requiredSum = 8;
boolean isSumPresent = checkSumPresentHash(numberList,requiredSum);
if(isSumPresent) {
System.out.println("Numbers exist");
}else {
System.out.println("Numbers donot exist");
}
}
private static boolean checkSumPresentHash(int[] numberList, int requiredSum) {
Map<Integer, Integer> m = new HashMap<Integer,Integer>();
int count = 0;
for(int i=0;i<numberList.length;i++){
m.put(i, numberList[i]);
}
for(int i=0;i<numberList.length;i++){
if(m.containsValue(requiredSum - numberList[i])){
count++;
}
}
if(count>1){
return true;
}
return false;
}
}
Tôi đang sử dụng HashMap.containsValue()
thay vì sử dụng một HashSet.contains()
mà chắc chắn có độ phức tạp của O(1)
vì, tôi phải giải thích cho các kịch bản mà đầu vào của tôi có thể chứa các giá trị giống hệt nhau. Ví dụ, trong trường hợp trên, tôi có thể có một tập hợp các giá trị đầu vào {3,6,4,4,7}
để khớp với sum 8
, sẽ trả về true
.
Độ phức tạp về thời gian của giải pháp trên tùy thuộc vào độ phức tạp của phương pháp HashMap.containsValue()
. Vui lòng giải thích một chút về độ phức tạp của phương pháp containsValue()
và đề xuất cho tôi nếu có giải pháp nào tốt hơn cho vấn đề trên về độ phức tạp của thời gian. Cảm ơn bạn.
Có lẽ bạn nên sử dụng 'Set' thay vì' Map'. – johnchen902
Tôi sẽ tò mò muốn xem một thuật toán giải quyết điều này trong thời gian O (n). Tôi không chắc chắn nó có thể. –
Làm thế nào về việc giữ một 'HashMap' riêng biệt với các giá trị của khóa đầu tiên làm khóa của mình? Bằng cách này bạn sẽ biết ngay lập tức con dơi ('O (1)') là một giá trị tồn tại. Đây là không gian 'O (2n)', nhưng hey, nó rất đáng tiếc. – acdcjunior