Tôi đã googling trong 2 giờ qua, và tôi không thể tìm thấy một danh sách các php được xây dựng trong chức năng thời gian và không gian phức tạp. Tôi có vấn đề isAnagramOfPalindrome để giải quyết với độ phức tạp tối đa cho phép sau đây:PHP được xây dựng trong chức năng phức tạp (isAnagramOfPalindrome chức năng)
expected worst-case time complexity is O(N)
expected worst-case space complexity is O(1) (not counting the storage required for input arguments).
trong đó N là độ dài chuỗi đầu vào. Đây là giải pháp đơn giản nhất của tôi, nhưng tôi không biết liệu nó có nằm trong giới hạn phức tạp hay không.
class Solution {
// Function to determine if the input string can make a palindrome by rearranging it
static public function isAnagramOfPalindrome($S) {
// here I am counting how many characters have odd number of occurrences
$odds = count(array_filter(count_chars($S, 1), function($var) {
return($var & 1);
}));
// If the string length is odd, then a palindrome would have 1 character with odd number occurrences
// If the string length is even, all characters should have even number of occurrences
return (int)($odds == (strlen($S) & 1));
}
}
echo Solution :: isAnagramOfPalindrome($_POST['input']);
Bất kỳ ai cũng có ý tưởng tìm loại thông tin này ở đâu?
EDIT
tôi phát hiện ra rằng array_filter
có O (N) phức tạp, và count
có O (1) phức tạp. Bây giờ tôi cần tìm thông tin trên count_chars
, nhưng một danh sách đầy đủ sẽ rất thuận tiện cho các biểu tượng trong tương lai.
EDIT 2
Sau khi một số nghiên cứu về không gian và thời gian phức tạp nói chung, tôi phát hiện ra rằng mã này có O (N) phức tạp thời gian và O (1) không gian phức tạp bởi vì:
Các count_chars
sẽ lặp lại N lần (chiều dài đầy đủ của chuỗi đầu vào, cho nó một sự phức tạp bắt đầu của O (N)). Điều này tạo ra một mảng với số lượng trường tối đa giới hạn (26 chính xác, số ký tự khác nhau), và sau đó nó đang áp dụng bộ lọc trên mảng này, có nghĩa là bộ lọc sẽ lặp tối đa 26 lần. Khi đẩy chiều dài đầu vào về phía vô cực, vòng lặp này là không đáng kể và nó được xem như là một hằng số. Đếm cũng áp dụng cho mảng không đổi được tạo ra này, và bên cạnh đó, nó là không đáng kể bởi vì độ phức tạp của hàm count
là O (1). Do đó, độ phức tạp của thuật toán là O (N).
Điều này cũng tương tự với độ phức tạp của không gian. Khi tính toán độ phức tạp của không gian, chúng ta không tính đầu vào, chỉ các đối tượng được tạo trong tiến trình. Các đối tượng này là mảng 26 phần tử và biến số đếm, và cả hai đều được coi là hằng số vì kích thước của chúng không thể tăng lên trên điểm này, không quan trọng đầu vào lớn như thế nào. Vì vậy, chúng ta có thể nói rằng thuật toán có độ phức tạp không gian của O (1).
Dù sao, danh sách đó sẽ vẫn có giá trị vì vậy chúng tôi không phải xem bên trong mã nguồn php. :)
Có lẽ bạn có để xem mã nguồn và tìm ra nó cho chính mình. Đây là câu hỏi có câu trả lời cho rằng cung cấp thông tin này cho một số chức năng: http: // stackoverflow.com/questions/2473989/danh sách-of-big-o-cho-php-chức năng – developerwjk
Tôi chạy vào đó, thông tin tuyệt vời, nhưng chỉ cho 'array_filter', không có gì trên' count' và 'count_chars'. – Skatch
Về mặt kỹ thuật, có hơn 26 ký tự khác nhau. Trừ khi vấn đề của bạn được đảm bảo chỉ cung cấp các ký tự từ bảng chữ cái tiếng Anh, sự phức tạp về không gian tồi tệ nhất của bạn cho count_chars() sẽ là min (N,
). Ngoài ra, đừng quên ghi chú trên/dưới vào tài khoản ... –