Kiểm tra dữ liệu trùng tại hai thời điểm liên tiếp!

Liên hệ QC
Thuật toán thì có nhưng vào vba thì với trình độ của em hơi lâu ạ!
Thuật toán thì em hiểu như sau:
Bước 0: Chọn 2 số khác nhau từ 0 đến 36 --> áp dụng với Time 00:00:00. Bắt đầu từ Time 00:00:01 tức T(0+1)
Bước 1: Kiểm tra đối với đối với các số từ 0-36 đảm bảo như điều kiện đầu bài nêu.
Giả sử có X1/37 số (từ 0 đến 36) thỏa mãn điều kiện. Thì sẽ có tổng cộng COMBIN(X1, 2) trường hợp có thể chọn. Chọn 1 trường hợp, bắt đầu bước sau.
Bước 2: Bắt đầu từ mốc thời gian tiếp theo. Kiểm tra đối với các số từ 0-36 đảm bảo điều kiện như đề bài nêu:
Nếu thỏa mãn thì tiếp tục đối với mốc thời gian tiếp theo.
Nếu không thỏa mãn thì quay lại Mốc thời gian trước đó để chọn trường hợp tiếp theo.
 
Lần chỉnh sửa cuối:
Cờ bạc cũng tốt mà bác! Cái chính là không thua!
 
Thuật toán thì có nhưng vào vba thì với trình độ của em hơi lâu ạ!
Thuật toán thì em hiểu như sau:
Bước 0: Chọn 2 số khác nhau từ 0 đến 36 --> áp dụng với Time 00:00:00. Bắt đầu từ Time 00:00:01 tức T(0+1)
Bước 1: Kiểm tra đối với đối với các số từ 0-36 đảm bảo như điều kiện đầu bài nêu.
Giả sử có X1/37 số (từ 0 đến 36) thỏa mãn điều kiện. Thì sẽ có tổng cộng COMBIN(X1, 2) trường hợp có thể chọn. Chọn 1 trường hợp, bắt đầu bước sau.
Bước 2: Bắt đầu từ mốc thời gian tiếp theo. Kiểm tra đối với các số từ 0-36 đảm bảo điều kiện như đề bài nêu:
Nếu thỏa mãn thì tiếp tục đối với mốc thời gian tiếp theo.
Nếu không thỏa mãn thì quay lại Mốc thời gian trước đó để chọn trường hợp tiếp theo.

https://drive.google.com/file/d/0B1IapRx55gmgcWN1bHN1VE5McWc/view?usp=sharing

Em minh họa lại thuật toán nói trên. Bác thử ngó xem ạ. Em bắn mấy điếu thuốc mà nó mới chạy được đến dòng 250/1440 dòng. Nản quá nên em dừng luôn (_ _*)
 
Thuật toán thì có nhưng vào vba thì với trình độ của em hơi lâu ạ!
Thuật toán thì em hiểu như sau:
Bước 0: Chọn 2 số khác nhau từ 0 đến 36 --> áp dụng với Time 00:00:00. Bắt đầu từ Time 00:00:01 tức T(0+1)
Bước 1: Kiểm tra đối với đối với các số từ 0-36 đảm bảo như điều kiện đầu bài nêu.
Giả sử có X1/37 số (từ 0 đến 36) thỏa mãn điều kiện. Thì sẽ có tổng cộng COMBIN(X1, 2) trường hợp có thể chọn. Chọn 1 trường hợp, bắt đầu bước sau.
Bước 2: Bắt đầu từ mốc thời gian tiếp theo. Kiểm tra đối với các số từ 0-36 đảm bảo điều kiện như đề bài nêu:
Nếu thỏa mãn thì tiếp tục đối với mốc thời gian tiếp theo.
Nếu không thỏa mãn thì quay lại Mốc thời gian trước đó để chọn trường hợp tiếp theo.
Thuật toán này mà áp dụng thì đúng là như khai sơn phá thạch, gặp đâu bổ đấy.
Làm kiểu thợ tiện thế này có ngày bóp reverse(iàz) mình đó bác.

Đề tài thấy có vẻ hấp dẫn nhưng khổ cái lại thích loto chứ không thích roulet nên xếp gạch hóng.
Vui vẻ nhé bạn--=0
 
Thuật toán này mà áp dụng thì đúng là như khai sơn phá thạch, gặp đâu bổ đấy.
Làm kiểu thợ tiện thế này có ngày bóp reverse(iàz) mình đó bác.

Đề tài thấy có vẻ hấp dẫn nhưng khổ cái lại thích loto chứ không thích roulet nên xếp gạch hóng.
Vui vẻ nhé bạn--=0

Dạ, em cũng chỉ mới nghĩ ra cách đó để làm thôi ạ.
Cũng đặt gạch hóng học hỏi các bác ạ.
 
Cảm ơn bạn đã giúp đỡ. Bạn có thể giúp mình theo file ở bài #18 được không ạ! Một lần nữa cảm ơn Bạn!

Em muốn hỏi 2 câu:
1. Bác cần cách làm hay đap số ạ. Nếu bác cần đáp số em sẽ post lại đáp số bác kiểm tra ạ.
2. Bác cần tất cả các đáp số có thể hay chỉ cần 1 đáp số thoả mãn với 00:01:00 = 6, 9 là đc ạ?
 
Cảm ơn Thầy Ba Tê và các bạn rất nhiều đã giúp giải quyết bài toán trên. Nay mình có bài toán này nhờ các Thầy và các bạn GPE xem giúp:
Đây là bài toán ngược so với bài toán trên. Và có thể nói là rất phức tạp, rất hi vọng GPE và các bạn xem giúp:Cột A là cột các thời điểm liên tiếp nhau (có 1044259 thời điểm liên tiếp nhau, có sự lặp lại) và cột B là cột dữ liệu tương ứng với mỗi thời điểm đó (dữ liệu là các số có từ 0 đến 36).Cột D là cột thời điểm kiểm tra đã được rút gọn (có 1440 thời điểm) Cột E và cột F là 2 cột dữ liệu cần tìm theo điều kiện như sau:1/ Tại E2 và F2 cho 2 dữ liệu ban đầu bất kì từ 0 đến 36 (ví dụ là 6 và 9)2/ Hãy tìm dữ liệu x1, x2, x3 .... ở cột E và y1, y2, y3...ở cột F tương ứng tại các thời điểm 00:02:00, 00:03:00,..v.v.., 23:59:00, 00:00:00 sao cho thoả mãn: - Cùng 1 thời điểm (cùng 1 dòng) thì 2 giá trị x và y phải khác nhau.- Các giá trị x1, x2, x3 ,... và y1, y2, y3,... là từ 0 đến 36.- Các giá trị ở 2 cột E và F tại 2 thời điểm liên tiếp nhau ( 2 thời điểm liên tiếp nhau là 2 thời điểm ở 2 dòng cạnh nhau) là không được xuất hiện lần nào tại 2 thời điểm liên tiếp đó ở cột A và B. Ví dụ:+ tại 2 thời điểm liên tiếp 00:01:00 và 00:02:00 dữ liệu cột E và F lần lượt là 6, x1 và 9, y1 thì tại 2 thời điểm liên tiếp đó ở cột A và dữ liệu ở cột B tương ứng không được có trường hợp nào xuất hiện kiểu dữ liệu liên tiếp là (6, x1); (9, y1); (6, y1) và (9, x1). + Tương tự như vậy ở 2 thời điểm liên tiếp 00:02:00 và 00:03:00 ở cột A và dữ liệu tương ứng cột B không có trường hợp dữ liệu liên tiếp là (x1,x2); (y1, y2); (x1, y2) và (y1, x2) + ...v.v..- Rất mong sự giúp đỡ của các bạn cho phương án tìm ra 2 cột dữ liệu thoã mãn điều kiện trên. Xin chân thành cảm ơn vô cùng!https://drive.google.com/file/d/0B0MAxLXOR5k-ZkY0WDJkX3NPOFU/view?usp=sharing
Bài toán này thuộc dạng có nhiều kết quả. Nhưng bạn không đề cập nên tôi lấy kết quả đầu tiên (x, y là những số nhỏ nhất thỏa điều kiện)
PHP:
Sub Main()
Dim Data As Variant, DicData As Object, i As Long, ResultKey As Variant, Result(1 To 1440, 1 To 2) As Long, Done As Boolean
Data = Range(Cells(&H100000, 1).End(xlUp), Cells(2, 2)).Value
Set DicData = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Data, 1) - 1
    DoEvents
    DicData.Item(Data(i, 1) & Data(i, 2) & "-" & Data(i + 1, 2)) = True
Next
ResultKey = Range("D2:D1441").Value
Result(1, 1) = Range("E2").Value
Result(1, 2) = Range("F2").Value
Support DicData, ResultKey, Result, 1, -1, Done
If Done Then
    Range("E2:F1441").Value = Result
Else
    MsgBox "Khong co ket qua thoa dieu kien"
End If
End Sub
PHP:
Private Sub Support(ByRef DicData As Object, ByRef ResultKey As Variant, ByRef Result() As Long, ByVal Pos As Long, ByVal x As Long, ByRef Done As Boolean)
Dim i As Long
If Done Then Exit Sub
DoEvents
For i = x + 1 To 36
    If Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 1) & "-" & i) And _
       Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 2) & "-" & i) Then
        If x < 0 Then
            x = i
        Else
            Result(Pos + 1, 1) = x
            Result(Pos + 1, 2) = i
            If Pos = 1439 Then
                Done = True
            Else
                Support DicData, ResultKey, Result, Pos + 1, -1, Done
            End If
            Exit Sub
        End If
    End If
Next
If Pos > 1 Then Support DicData, ResultKey, Result, Pos - 1, Result(Pos, 2), Done
End Sub
 
Em muốn hỏi 2 câu:
1. Bác cần cách làm hay đap số ạ. Nếu bác cần đáp số em sẽ post lại đáp số bác kiểm tra ạ.
2. Bác cần tất cả các đáp số có thể hay chỉ cần 1 đáp số thoả mãn với 00:01:00 = 6, 9 là đc ạ?
Cảm ơn bạn! Mình cần cách làm và đáp số bạn ạ. Sao cho mỗi lần chạy mình chỉ cần một đáp số thoả mãn từ thời điểm 00:01:00 cho đến 00:00:00 (đúng thoả mãn liên tiếp 1440 thời điểm) là tuyệt rồi ạ! Xin cảm ơn bạn!
- Bạn ơi cho mình hỏi một chút: cách làm của bạn là thử chọn lần lượt từ 0 đến 36 thoả mãn là lấy. Vậy nếu mình chọn các số từ 0 đến 36 mà có thêm điều kiên lựa chọn cho các số này thì có thể làm được không ạ? Mình thấy đây là cả một vấn đề phức tạp.
 
Lần chỉnh sửa cuối:
Bài toán này thuộc dạng có nhiều kết quả. Nhưng bạn không đề cập nên tôi lấy kết quả đầu tiên (x, y là những số nhỏ nhất thỏa điều kiện)
PHP:
Sub Main()
Dim Data As Variant, DicData As Object, i As Long, ResultKey As Variant, Result(1 To 1440, 1 To 2) As Long, Done As Boolean
Data = Range(Cells(&H100000, 1).End(xlUp), Cells(2, 2)).Value
Set DicData = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(Data, 1) - 1
    DoEvents
    DicData.Item(Data(i, 1) & Data(i, 2) & "-" & Data(i + 1, 2)) = True
Next
ResultKey = Range("D2:D1441").Value
Result(1, 1) = Range("E2").Value
Result(1, 2) = Range("F2").Value
Support DicData, ResultKey, Result, 1, -1, Done
If Done Then
    Range("E2:F1441").Value = Result
Else
    MsgBox "Khong co ket qua thoa dieu kien"
End If
End Sub
PHP:
Private Sub Support(ByRef DicData As Object, ByRef ResultKey As Variant, ByRef Result() As Long, ByVal Pos As Long, ByVal x As Long, ByRef Done As Boolean)
Dim i As Long
If Done Then Exit Sub
DoEvents
For i = x + 1 To 36
    If Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 1) & "-" & i) And _
       Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 2) & "-" & i) Then
        If x < 0 Then
            x = i
        Else
            Result(Pos + 1, 1) = x
            Result(Pos + 1, 2) = i
            If Pos = 1439 Then
                Done = True
            Else
                Support DicData, ResultKey, Result, Pos + 1, -1, Done
            End If
            Exit Sub
        End If
    End If
Next
If Pos > 1 Then Support DicData, ResultKey, Result, Pos - 1, Result(Pos, 2), Done
End Sub
Cảm ơn bạn Huuthang_bd rất nhiều. Mình đưa code vào file và chạy không biết mình có sai chỗ nào mà chạy không có kết quả nào bạn ạ- mong bạn chỉ giúp!

- Còn trong trường hợp kết quả mà có sự giàng buộc thêm điều kiện thì mình không biết có phức tạp quá không: các số từ 0 cho đến 36 mình có thêm bảng tần suất xuất hiện của các số đó (như file đi kèm minh hoạ)
Bình thường khi mình lựa chọn 2 số ở mỗi thời điểm: mình thường ưu tiên lựa chọn những số mà có tần suất xuất hiện ít nhất. Ví dụ ở thời điểm 00:01:00 mình sẽ lựa chọn số 5 và số 29 vì nó có số lần xuất hiện ít nhất tương ứng lần lượt là 10 và 11.
Tại thời điểm tiếp theo: 00:02:00 thì mình sẽ thử chọn lần lược các số có số lần xuất hiện ít nhất như số : 0 và số 5 có số lần xuất hiện là 13 và 10 lần, nếu 2 số này không thoả mãn lại lựa chọn số khác cho đến khi thoả mãn.
Đó là lựa chọn có sự giàng buộc (Nhưng vấn đề này mình nghĩ rất phức tạp vì vậy mới đưa ra trường hợp là lựa chọn bất kì sao cho thoả mãn là được)
- Thật sự vấn đề này mình ko dám đưa ra là vì nó phức tạp quá!
- Đây là file gửi kèm ạ: https://drive.google.com/file/d/0B0MAxLXOR5k-SHc0Tmg1QVV3Z3M/view?usp=sharing
 
Cảm ơn bạn Huuthang_bd rất nhiều. Mình đưa code vào file và chạy không biết mình có sai chỗ nào mà chạy không có kết quả nào bạn ạ- mong bạn chỉ giúp!

- Còn trong trường hợp kết quả mà có sự giàng buộc thêm điều kiện thì mình không biết có phức tạp quá không: các số từ 0 cho đến 36 mình có thêm bảng tần suất xuất hiện của các số đó (như file đi kèm minh hoạ)
Bình thường khi mình lựa chọn 2 số ở mỗi thời điểm: mình thường ưu tiên lựa chọn những số mà có tần suất xuất hiện ít nhất. Ví dụ ở thời điểm 00:01:00 mình sẽ lựa chọn số 5 và số 29 vì nó có số lần xuất hiện ít nhất tương ứng lần lượt là 10 và 11.
Tại thời điểm tiếp theo: 00:02:00 thì mình sẽ thử chọn lần lược các số có số lần xuất hiện ít nhất như số : 0 và số 5 có số lần xuất hiện là 13 và 10 lần, nếu 2 số này không thoả mãn lại lựa chọn số khác cho đến khi thoả mãn.
Đó là lựa chọn có sự giàng buộc (Nhưng vấn đề này mình nghĩ rất phức tạp vì vậy mới đưa ra trường hợp là lựa chọn bất kì sao cho thoả mãn là được)
- Thật sự vấn đề này mình ko dám đưa ra là vì nó phức tạp quá!
- Đây là file gửi kèm ạ: https://drive.google.com/file/d/0B0MAxLXOR5k-SHc0Tmg1QVV3Z3M/view?usp=sharing
Nếu không có kết quả mà cũng không có thông báo gì hết thì code chạy chưa xong.
Để kiểm tra có phải như vậy không thì bạn thêm dòng thông báo cuối Sub Main rồi thử lại.
PHP:
Msgbox "Xong"
 
Cảm ơn bạn Huuthang_bd rất nhiều. Mình đưa code vào file và chạy không biết mình có sai chỗ nào mà chạy không có kết quả nào bạn ạ- mong bạn chỉ giúp!

- Còn trong trường hợp kết quả mà có sự giàng buộc thêm điều kiện thì mình không biết có phức tạp quá không: các số từ 0 cho đến 36 mình có thêm bảng tần suất xuất hiện của các số đó (như file đi kèm minh hoạ)
Bình thường khi mình lựa chọn 2 số ở mỗi thời điểm: mình thường ưu tiên lựa chọn những số mà có tần suất xuất hiện ít nhất. Ví dụ ở thời điểm 00:01:00 mình sẽ lựa chọn số 5 và số 29 vì nó có số lần xuất hiện ít nhất tương ứng lần lượt là 10 và 11.
Tại thời điểm tiếp theo: 00:02:00 thì mình sẽ thử chọn lần lược các số có số lần xuất hiện ít nhất như số : 0 và số 5 có số lần xuất hiện là 13 và 10 lần, nếu 2 số này không thoả mãn lại lựa chọn số khác cho đến khi thoả mãn.
Đó là lựa chọn có sự giàng buộc (Nhưng vấn đề này mình nghĩ rất phức tạp vì vậy mới đưa ra trường hợp là lựa chọn bất kì sao cho thoả mãn là được)
- Thật sự vấn đề này mình ko dám đưa ra là vì nó phức tạp quá!
- Đây là file gửi kèm ạ: https://drive.google.com/file/d/0B0MAxLXOR5k-SHc0Tmg1QVV3Z3M/view?usp=sharing

Cảm ơn bác Huuthang_bd, thuật toán và code của bác quá đẹp.


Em chạy code của bác Huuthang_bd có kết quả mà bác?
Đoạn
Mã:
If Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 1) & "-" & i) And _
           Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 2) & "-" & i) Then
trong Support cần bổ sung thêm điều kiện i <> Result(Pos,1) và i <> Result(Pos,2)



Tại thời điểm tiếp theo: 00:02:00 thì mình sẽ thử chọn lần lược các số có số lần xuất hiện ít nhất như số : 0 và số 5 có số lần xuất hiện là 13 và 10 lần, nếu 2 số này không thoả mãn lại lựa chọn số khác cho đến khi thoả mãn.
Bác nói luôn từ đầu có khi bác Huuthang_bd làm luôn cho bác rồi.
Theo em hiểu là thay cái chuỗi 0:36 thành 1 mảng 2 chiều ((0:36), số lần xuất hiện sắp xếp theo số lần xuất hiện tăng dần) tại Thời điểm kiểm tra rồi thay vào cái đoạn trên. Chém thế nhưng nói thật với bác là em chưa biết làm.
 
Cảm ơn bác Huuthang_bd, thuật toán và code của bác quá đẹp.


Em chạy code của bác Huuthang_bd có kết quả mà bác?
Đoạn
Mã:
If Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 1) & "-" & i) And _
           Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 2) & "-" & i) Then
trong Support cần bổ sung thêm điều kiện i <> Result(Pos,1) và i <> Result(Pos,2)




Bác nói luôn từ đầu có khi bác Huuthang_bd làm luôn cho bác rồi.
Theo em hiểu là thay cái chuỗi 0:36 thành 1 mảng 2 chiều ((0:36), số lần xuất hiện sắp xếp theo số lần xuất hiện tăng dần) tại Thời điểm kiểm tra rồi thay vào cái đoạn trên. Chém thế nhưng nói thật với bác là em chưa biết làm.
Thật sự với mình khi tìm dãy số đó không có điều kiện gì đã là cả một vấn đề rồi nên ban đầu không dám đưa ra thêm điều kiện sợ phức tạp quá. Còn bạn Huuthang_bd thì khỏi nói từ trước đến nay những vấn đề gì bạn Huuthang_bd giúp thì chỉ có thể âm thầm mà khâm phục cách làm của bạn thôi!
 
Dạ, em đã coi lại đầu bài và đúng là em nhầm ạ!
 
Cảm ơn bác Huuthang_bd, thuật toán và code của bác quá đẹp.


Em chạy code của bác Huuthang_bd có kết quả mà bác?
Đoạn
Mã:
If Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 1) & "-" & i) And _
           Not DicData.Exists(ResultKey(Pos, 1) & Result(Pos, 2) & "-" & i) Then
trong Support cần bổ sung thêm điều kiện i <> Result(Pos,1) và i <> Result(Pos,2)




Bác nói luôn từ đầu có khi bác Huuthang_bd làm luôn cho bác rồi.
Theo em hiểu là thay cái chuỗi 0:36 thành 1 mảng 2 chiều ((0:36), số lần xuất hiện sắp xếp theo số lần xuất hiện tăng dần) tại Thời điểm kiểm tra rồi thay vào cái đoạn trên. Chém thế nhưng nói thật với bác là em chưa biết làm.
Bạn ơi, bạn có thể gửi file bạn chạy code của bạn Huuthang_bd cho mình được không? Không hiểu sao mình chạy lại không ra kết quả và xuất hiện bảng báo lỗi: "Out of stack space" và mở ra thông báo màu vàng đoạn "Support DicData, ResultKey, Result, Pos + 1, -1, Done" . Mong bạn chỉ giúp! Xin cảm ơn bạn!
 
Lần chỉnh sửa cuối:
Bạn ơi, bạn có thể gửi file bạn chạy code của bạn Huuthang_bd cho mình được không? Không hiểu sao mình chạy lại không ra kết quả và xuất hiện bảng báo lỗi: "Out of stack space" và mở ra thông báo màu vàng đoạn "Support DicData, ResultKey, Result, Pos + 1, -1, Done" . Mong bạn chỉ giúp! Xin cảm ơn bạn!
Mình đã tra nghiên cứu những lỗi khác như bộ nhớ ram: khi mình cho chạy code thì bộ nhớ của máy mới hoạt động tới 27% thôi (ram máy mình 12Gb nên còn rất nhiều). Vì vậy mình không hiểu lỗi này là do đâu? Rất Mong GPE giúp đỡ!
 
Ủa, em đang không có máy tính ở đây. Nhưng em nhớ lắp code của bác huuthang_bd chạy ngon luôn. Vấn đề chắc ko phải do code. Bác thử check lại cái cột thời gian kiểm tra, hình như dòng 00:02:00 và 00:03:00 format khác với các dòng khác. Copy paste lại từ column A xem ạ? Nếu vấn ko được thì chiều nay em gửi lại bác cái file em chạy.
 
Web KT

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

Back
Top Bottom