Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Em không hiểu về bài tìm max này?

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Mặc định Em không hiểu về bài tìm max này?

    PHP Code:
    int max (int *array, int len)
    {
        
    int n1,n2 ;
        if (
    len == 0) return array[0];
        
    n1 max(array , len/2) ;
        
    n2 max(array + len/len len/2); 
        return (
    n1 n2 n1 n2) ;

    Em không hiểu về đoạn code trên lắm.Mong các anh giải thích giúp em!!

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    n2 = max(array + len/2 , len - len/2);
    Em khó hiểu chắc anh đoán chỗ này, đây là phép cộng con trỏ :
    <-> *(array + len/2);
    suy nghĩ lại xem ?

  3. #3
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Hix.Phép cộng con trỏ thì em học rồi nhưng đoạn code trên có cho ra giá trị max trong mảng không anh?

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Không em à , sai 1 tí !
    C++ Code:
    1. #include <iostream>
    2.  
    3. namespace vv{
    4.     template <typename T>
    5.     T max(T* ary, unsigned size){
    6.         if(size == 1)
    7.             return ary[0];
    8.         return max(ary, size/2) > max(ary + size/2, size - size/2)
    9.              ?  max(ary, size/2) : max(ary + size/2, size - size/2);
    10.     }
    11. }
    12.  
    13. int main(){
    14.     int ary[5] = {1,3000,34000,4393,51913};
    15.     std::cout << vv::max<int>(ary, 5);
    16. }

    C version đây luôn em :
    C Code:
    1. #include <cstdio>
    2.  
    3. int max(int* ary, unsigned size){
    4.      if(size == 1)
    5.          return ary[0];
    6.      return max(ary, size/2) > max(ary + size/2, size - size/2)
    7.           ?  max(ary, size/2) : max(ary + size/2, size - size/2);
    8. }
    9.  
    10. int main(){
    11.     int ary[5] = {1,3000,34000,4393,51913};
    12.     printf("%d", max(ary, 5));
    13. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 11-04-2008 lúc 07:20 AM.

  5. #5
    Ngày gia nhập
    12 2007
    Bài viết
    224

    À , bài tìm max trong một mảng sử dụng đệ quy hả . bạn xem code này nè :

    C Code:
    1. int max(int *a,int len)
    2. {
    3.  if(len==1) return a[0];
    4.  if(a[len-1]>max(a,len-1)) return a[len-1];
    5.  else return max(a,len-1);
    6. }

    Ý tưởng chính của thuật toán đệ quy này là : Ví dụ bài toán tìm ra em học sinh cao nhất trong 1 lớp học . Nếu như lớp đó chỉ có một học sinh thì học sinh đó là người cao nhất . Còn nếu có nhiều học sinh thì ta lấy ra một học sinh bất kỳ trong lớp và đem so sánh với người cao nhất trong đám học sinh còn lại . Nếu như em vừa lấy ra cao hơn em cao nhất trong đám đó thì em đó là cao nhất lớp , ngược lại thì em cao nhất trong đám đó sẽ là người cao nhất.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Em không hiểu về bài tìm max này?

    Bài của sieuphuong là đệ qui tail, độ phức tạp không đổi vẫn O(n), trong khi giải thuật của nhocxinh là dạng divide-conquer, code chạy hiệu quả hơn nhiều, O(nlogn)

  7. #7
    Ngày gia nhập
    03 2008
    Nơi ở
    TP HCM
    Bài viết
    30

    Thanks các anh nhiều lắm!
    Code:
    int max(int *a, int n)
    {
     if (n == 1)
          return a[0];
     else
     {
          if(a[n-1] > a[n-2])
               a[n-2] = a[n-1] ;
          return max(a, n-1) ;
     }
    }
    Đoạn code trên với đoạn code của anh siêu phương thì độ phức tạp bằng nhau phải không anh?

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Bài của sieuphuong là đệ qui tail, độ phức tạp không đổi vẫn O(n), trong khi giải thuật của nhocxinh là dạng divide-conquer, code chạy hiệu quả hơn nhiều, O(nlogn)
    Rõ ràng nếu như n tiến đến vô cực thì n < nlogn chứ anh Rok .

  9. #9
    Ngày gia nhập
    01 2008
    Bài viết
    41

    Đoạn code của nhocxinh độ phức tạp chỉ là O(log n) thôi.

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Ặc anh nhầm T_T, thanks cậu Huybk, O(logn). Sorry sieuphuong !

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn