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






2.45/5 (10投票s)
搜索和排序 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