Thông báo

Collapse
No announcement yet.

Cần trợ giúp 1 bài toán xử lí nhỏ !

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Cần trợ giúp 1 bài toán xử lí nhỏ !

    Lúc nảy mình gởi bài mà bác quản trị close mình thấy không hợp lý. Luồng của Pic thì tất nhiên liên quan tới lập trình chứ sao bác lại nói không liên quan tới điện tử và PIC, nếu có giải thuật thì sau này mọi người có thể ứng dụng chứ. Bài này của mình là đang viết code cho pic nhận dữ liêu nút remote hồng ngoại nhưng nhận nhiều remote thì gây hiện tượng xử lí chậm. post lên để hỏi ai có cách thì giúp mình thôi. Sau đây mình xin post lại mong bác quản trị đừng close vì mình đang cần.
    Mục tiêu là code làm sao để so sánh giá trị nhận được từ mắt hồng ngoại (giả sử b=0x20) và so sánh với các giá trị trong mảng cho trước(a[100]={1,2,...} một cách nhanh nhất để đở mất thời gian xử lí gây chậm pic. giả sử nếu làm theo cách thông thường:
    Code:
    for(i=0;i<100;i++)
    {
      if(b==a[i])
      {
      //thực thi lệnh
      }
    }
    bác quản trị mà close lần nữa tui nghỉ chơi zới dtvn lun

  • #2
    Liệu dùng Switch ... case được không nhỉ.

    Comment


    • #3
      Nguyên văn bởi 0977817726 Xem bài viết
      Liệu dùng Switch ... case được không nhỉ.
      Dùng switch...case thì mcu cũng phải đi tìm và so giá trị y như dùng for và if

      Comment


      • #4
        Như code trên, a[i] và b đều là những con số. Bạn dùng thuật toán sắp xếp sao cho giá trị mảng a từ nhỏ đến lớn hoặc lớn đến nhỏ. Sau đó dùng thuật toán tìm kiếm nhị phân.
        Có lẽ đây là cách khả thi nhất. Có cao thủ nào có giải thuật khác không ạ ?

        Comment


        • #5
          Nguyên văn bởi qloi Xem bài viết
          Bài này của mình là đang viết code cho pic nhận dữ liêu nút remote hồng ngoại nhưng nhận nhiều remote thì gây hiện tượng xử lí chậm.

          Mục tiêu là code làm sao để so sánh giá trị nhận được từ mắt hồng ngoại (giả sử b=0x20) và so sánh với các giá trị trong mảng cho trước(a[100]={1,2,...} một cách nhanh nhất để đở mất thời gian xử lí gây chậm pic. giả sử nếu làm theo cách thông thường:
          Code:
          for(i=0;i<100;i++)
          {
          if(b==a[i])
          {
          //thực thi lệnh
          }
          }
          Trước tiên bạn sửa lại thành mảng có 256 phần tử, rồi gán các phần tử a[1]=1, a[2]=1... Các phần tử còn lại thì =0. Sau đó chỉ cần so sánh 1 lần:
          Code:
          if(a[b]==1) thực thi lệnh
          sau.ph

          Comment


          • #6
            Nguyên văn bởi abc147 Xem bài viết
            Như code trên, a[i] và b đều là những con số. Bạn dùng thuật toán sắp xếp sao cho giá trị mảng a từ nhỏ đến lớn hoặc lớn đến nhỏ. Sau đó dùng thuật toán tìm kiếm nhị phân.
            Có lẽ đây là cách khả thi nhất. Có cao thủ nào có giải thuật khác không ạ ?
            Phương pháp của bạn củng có lí. Vì giá trị trong mảng là 100 số khác nhau, không có cái nào giống cái nào.Sau khi tìm được giá trị thì dùng break để thoát khỏi vòng lặp có vẻ hiệu quả.
            Thanks all

            Comment


            • #7
              Mình hiểu phương pháp của ban xomthulo nhưng phương pháp của bạn thì trong mảng phải sắp xếp theo giá trị tăng dần. Ở đây mảng của mình có giá trị bất kì. Ví dụ A[]={0,0,0,0,0}. Đặc điểm của mảng là giá trị ban đầu = 0 hết, trong qua trình hoạt động nó sẽ thêm dần giá trị vào như lần 1 A[]={1,0,0,0,0} lần 2 A[]={1,5,0,0,0}, lần 3 A[]={1,5,3,0,0} ...mà số phần tử có thể lên tới 100, mổi phần tử 32bit, để kiểm tra từng phần tử cho đến hết thì rất mất thời gian cho vi điều khiển. Nên mình mún tìm phương pháp nào dò ra kết quả nhanh nhất để thoát khỏi vòng lặp kiểm tra càng sơm càng tốt.Nếu dùng phương pháp của bạn thì lúc lưu giá trị vào mảng phải làm thêm việc sắp xếp lại trật tự cho các phần tử? vì các giá trị trên sẻ được lưu vào EEPROM. nếu săp xếp lại thì hại não lắm đây

              Comment


              • #8
                Nguyên văn bởi qloi Xem bài viết
                Mình hiểu phương pháp của ban xomthulo nhưng phương pháp của bạn thì trong mảng phải sắp xếp theo giá trị tăng dần. Ở đây mảng của mình có giá trị bất kì. Ví dụ A[]={0,0,0,0,0}. Đặc điểm của mảng là giá trị ban đầu = 0 hết, trong qua trình hoạt động nó sẽ thêm dần giá trị vào như lần 1 A[]={1,0,0,0,0} lần 2 A[]={1,5,0,0,0}, lần 3 A[]={1,5,3,0,0} ...mà số phần tử có thể lên tới 100, mổi phần tử 32bit, để kiểm tra từng phần tử cho đến hết thì rất mất thời gian cho vi điều khiển. Nên mình mún tìm phương pháp nào dò ra kết quả nhanh nhất để thoát khỏi vòng lặp kiểm tra càng sơm càng tốt.Nếu dùng phương pháp của bạn thì lúc lưu giá trị vào mảng phải làm thêm việc sắp xếp lại trật tự cho các phần tử? vì các giá trị trên sẻ được lưu vào EEPROM. nếu săp xếp lại thì hại não lắm đây
                Chào qloi, cách hiệu quả nhất là của T.L.M đấy. Nhưng phần tử con phải có size nhỏ nếu 32b thì không dùng được. Còn với dãy lớn thì cách kiểm tra từng phần tử trong mảng là only one.

                Comment


                • #9
                  - cái này chỉ áp dụng khi mảng nhiều quá thôi chứ tầm 100 phần tử thì dùng for cho tiện
                  - Mình nghĩ dùng cây nhị phân để tìm kiếm trong trường hợp này là tốt nhất.
                  https://vi.wikipedia.org/wiki/C%C3%A...B%8B_ph%C3%A2n
                  Trong C thì không có đối tượng nên mình dùng 3 mảng a,b,c mảng a chứa dữ liệu. mảng b chứa vị trí tiếp theo bên phải, còn mảng c chứa vị trí tiếp theo bên trái.
                  - Còn tìm được số Index rồi làm sao để gọi hàm chắc phải dùng ASM quá.

                  Comment


                  • #10
                    hồi đó mình project cũng gặp trường hợp tương tự vậy - loay hoay mãi để tối ưu code cho chạy nhanh
                    cuối cùng tìm cách giải quyết đơn giản nhất là : thay thế bằng con dsPIC tốc độ cao hơn
                    hình như tốc độ max của dsPIC là 70 MIPS
                    Đang thất nghiệp 0988-010-486

                    Comment


                    • #11
                      theo mình được biết thì if else tốn nhiều thời gian xử lý hơn switch case

                      Comment

                      Về tác giả

                      Collapse

                      qloi Tìm hiểu thêm về qloi

                      Bài viết mới nhất

                      Collapse

                      Đang tải...
                      X