Translate

Thứ Tư, 29 tháng 8, 2012

Giải thuật đếm số ký tự trong chuỗi



1- Thống kê chỉ một ký tự:
- Xác định độ dài của chuỗi L1
- Thay thế (xóa) ký tự muốn đếm với ""
- Xác định lại độ dài của chuỗi L2
- Tổng số ký tự muốn đếm là L1-L2

2- Thống kê các ký tự có trong chuỗi:
- Cho vòng lặp chạy đến khi chuỗi = ""
-Trong vòng lặp:
* Độ dài chuỗi L1
* Thế ký tự đầu tiên của chuỗi với "" (xóa các ký tự giống ký tự đầu)
* Độ dài chuỗi mới L2
* Ghi nhớ ký tự bị xóa với số đếm là L1-L2
* Gán L1 = L2... và tiếp tục


------
9/3/2014

Đếm số từ trong một đoạn văn

by xuanha

Private Function CountedWords&(ByVal sPara$, ByVal sWord$)
    Dim x() As String
    x = Split(sPara, sWord)
    CountedWords = UBound(x)
End Function

Private Sub Command1_Click()
    MsgBox CountedWords("nnnnnn", "n")
End Sub

sPara là đoạn văn cần tìm
sWord là từ cần tìm, sWord có thể là một chuỗi
Hàm CountedWords trả về là một số Long:
-1 ứng với NullString
0 ứng với không có từ tương ứng trong đoạn văn

>0 là số từ đếm được

4 nhận xét:

  1. Code VB6 Minh họa giải thuật:

    Function ThôngKê1Kytu(ByVal Chuôi$, kt$, Optional KhôngHOAthuong As Long = 1) As Long
    Dim L1&: L1 = Len(Chuôi) 'truongphu@caulacbovb.com
    ThôngKê1Kytu = L1 - Len(Replace(Chuôi, kt, "", , , KhôngHOAthuong))
    End Function

    Private Sub Command1_Click()
    Dim aaa$: aaa = "TfdgjbkuypdkmvtekfutpmDxg"
    MsgBox "T: " & ThôngKê1Kytu(aaa, "T", 0) ' Tính HOA thuong
    MsgBox "T: " & ThôngKê1Kytu(aaa, "T") ' không HOA thuong
    End Sub


    Function ThôngKêCacKyTu(ByVal Chuôi$, Optional KhôngHOAthuong As Long = 1) As String
    Dim L1&: L1 = Len(Chuôi) 'truongphu@caulacbovb.com
    Dim L2&, S As String * 1, temp$
    Do Until Chuôi = ""
    S = Left(Chuôi, 1)
    Chuôi = Replace(Chuôi, S, "", , , KhôngHOAthuong)
    temp = temp & S & " = " & L1 - Len(Chuôi) & ", "
    L1 = Len(Chuôi)
    Loop
    ThôngKêCacKyTu = temp
    End Function

    Private Sub Command2_Click()
    Dim aaa$: aaa = "TfdgjbkuypdkmvtekfupmDxg"
    MsgBox ThôngKêCacKyTu(aaa) ' không HOA thuong
    MsgBox ThôngKêCacKyTu(aaa, 0) ' Tính HOA thuong
    End Sub

    Trả lờiXóa
  2. làm sao mà đếm xong mà không biến dạng chuỗi mới hay chứ, chỉ đếm không làm thay đổi

    Trả lờiXóa
    Trả lời
    1. 1- Đếm mà không biến dạng chuỗi:
      Việc biến dạng chuỗi trong lập trình không đặt nặng lắm. Bạn chỉ cần cho một biến String mang giá trị của chuỗi; sau đó thao tác trên biến String nầy là xong.
      2- Chỉ đếm không làm thay đổi:
      Riêng trên bàn phím mã ASCII đã có 95 kí tự, nhóm Unicode có thêm 134 kí tự nữa, tổng là trên 200 kí tự.
      Nếu bạn đếm thông thường, cứ mỗi ký tự của chuỗi, bạn phải so sánh nó với 229 kí tự mẫu. Sau khi có kết quả, bạn phải cọng thêm 1 vào mảng mẫu tương ứng. Với thuật toán như thế, bạn dùng vòng lặp để duyệt hết chuỗi rõ ràng sẽ rất mất công, không tối ưu cho công việc. Nếu chuỗi khá dài, (vài MB), thậm chí có thể treo máy!
      3- Vì thế, code trên, nếu bạn phân tích lại sẽ thấy nhiều ưu điểm: chúng chỉ thống kê các ký tự hiện diện mà không cần so sánh mẫu; chuỗi xét càng lúc càng ngắn sẽ tăng nhanh thời gian tính toán. Vì thế, bài viết và code trên mới được lựa chọn để đăng vì tính tối ưu của nó.

      Cảm ơn bạn đã đọc bài và trao đổi.

      Xóa
  3. Phải nói là giải thuật của bác rất thông minh & hiệu quả. Em là người không học hành bài bản nên rất ghét những cái gì hàn lâm & quy tắc giáo điều, em chỉ quan tâm tới đầu ra nó là cái gì, kết quả ra sao. Đứng trên quan điểm người dùng, họ chỉ cần biết chương trình chạy có nhanh không, có tốt không, mà không cần biết tới những dòng Code đẹp.

    Chúc bác luôn có nhiều ý tưởng hay, nhiều bài viết bổ ích.

    Trả lờiXóa

Trực tuyến

Mục lục Toàn bộ (theo thứ tự thời gian)

Trực tuyến