65.9K
CodeProject 正在变化。 阅读更多。
Home

Pocket PC 扁平文件数据库搜索引擎

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.45/5 (10投票s)

2004年1月23日

CPOL

1分钟阅读

viewsIcon

46404

downloadIcon

120

搜索和排序 Pocket PC 平面文本文件。

引言

我的一个项目是为了解决数据库搜索速度的问题。应用程序的第一个版本使用了 ADOCE。我的客户希望通过 ActiveSync 将 PC 上的平面文本文件转换为 Pocket PC 数据库。在第一个版本发布后,我们不断接到他们关于转换速度慢的投诉。

然后我对一个包含 5000 条记录的小型数据库进行了一些测试。完成这个过程大约需要 20 分钟。这是不可接受的。因此,我决定使用平面文本文件作为数据库容器,因为我们的应用程序只将其用作只读。

首先,我们需要对文本文件进行排序。演示项目包含一个测试数据库(MyFile.txt)。它是一个纯粹的平面文本文件。每行有两个由“|”字符分隔的列。(您可以定义自己的分隔符。)第一列将是搜索索引。

单击“加载”按钮,系统将打开 MyFile.txt,对其进行排序并将其加载到系统内存中。我使用快速排序算法(参见 List1 和 List 2)进行排序。结果存储在 retarray 变量中,并使用二分搜索算法执行搜索功能(参见 List3)。

我对结果非常满意。将文本文件从 PC 传输到 PPC 仅用了 30 秒,排序又用了 30 秒。二分搜索算法非常高效。演示项目将显示搜索时间和一次搜索期间搜索的项目数量。

List1

Private Function QuickSort(l As Integer, r As Integer)
    Dim M, i, j, v
    M = 4
    If (r - l) > M Then
        i = (r + l) / 2
        If getkey(retarray(l)) > getkey(retarray(i)) Then
            swap l, i 'Tri-Median Methode!
        End If
        If getkey(retarray(l)) > getkey(retarray(r)) Then
            swap l, r
        End If
        If getkey(retarray(i)) > getkey(retarray(r)) Then
            swap i, r
        End If
        j = r - 1
        swap i, j
        i = l
        v = retarray(j)
        Do While (True)
            i = i + 1
            Do While (getkey(retarray(i)) < getkey(v))
                i = i + 1
            Loop
            j = j - 1
            Do While (getkey(retarray(j)) > getkey(v))
                j = j - 1
            Loop
            If (j < i) Then
                Exit Do
            End If
            swap i, j
        Loop
        swap i, r - 1
        QuickSort l, j
        QuickSort i + 1, r
    End If
End Function

List 2

Private Function InsertionSort(lo0 As Integer, hi0 As Integer)
    Dim i1, j1, v1
    For i1 = lo0 + 1 To hi0
        v1 = retarray(i1)
        j1 = i1
        Do While ((j1 > lo0))
            If (getkey(retarray(j1 - 1)) > getkey(v1)) Then
                retarray(j1) = retarray(j1 - 1)
                j1 = j1 - 1
            Else
                Exit Do
            End If
        Loop
        retarray(j1) = v1
    Next
End Function

List3

Function bisearch(Target As String, ByRef bk, _
                                 ByRef totalrec, ByRef searchcount)
    Dim midone, first, last, ret, temp
    Dim i
    ret = False
    first = 0
    last = UBound(retarray) - 1
    totalrec = last
    i = 0
    Do While (first <= last)
        midone = Round((first + last) / 2)
        'If Trim(oparray(midone)) <> "" Then
        temp = retarray(midone)
        temp2 = Split(temp, "|")
        If UCase(Trim(temp2(0))) = UCase(Trim(Target)) Then
            ret = True
            bk = temp
            Exit Do
        End If
        If UCase(Trim(temp2(0))) > UCase(Trim(Target)) Then
            last = midone - 1
        Else
            first = midone + 1
        End If
        i = i + 1
    Loop
    searchcount = i
    bisearch = ret
End Function
© . All rights reserved.