用二分法查找第一个断码的数字
时 间:2013-12-12 22:39:44
作 者:Aaron ID:20267 城市:闵行
摘 要:对于一系列没有重复的数字,用二分法查出最小的一个断码数字。
正 文:
对于一系列没有重复的数字,用二分法查出最小的一个断码数字。
对于上千万条记录,几十毫秒就搞定了。
自己扩展到带前缀的编号补充断码去吧:)
Time=t*log(Nmax,2)
Time:总时间
t:一次迭代的时间
Nmax:记录最大的数字
log(Nmax,2):以2为底,Nmax的对数
'//*******************************************************************
'//函数调用
Me.txtResult = Me.txtResult & ReplenishTable("表3", "ID") & vbCrLf
'//*******************************************************************
Public Function ReplenishTable(TableName As String, FieldName As String) As Long
Dim lngStart As Long
Dim lngMax As Long
On Error GoTo ErrorHandler
If DCount(FieldName, TableName) = 0 Then
ReplenishTable = 1
GoTo ExitHere
End If
lngMax = DMax(FieldName, TableName)
ReplenishTable = LossNumber(TableName, FieldName, 1, lngMax)
ExitHere:
Exit Function
ErrorHandler:
ReplenishTable = -1
MsgBox Err.Number & Err.Description
Resume ExitHere
End Function
Public Function LossNumber(TableName As String, _
FieldName As String, _
Optional StartNumber As Long = -1, _
Optional EndNumber As Long = -1, _
Optional LastEnd As Long = -1 _
) As Long
Dim lngCountRecords As Long
Dim lngCalRecords As Long
Dim lngNextStart As Long, lngNextEnd As Long, lngNextLast As Long
If StartNumber = -1 Then StartNumber = 1
lngCountRecords = CountRecords(TableName, FieldName, StartNumber, EndNumber)
lngCalRecords = CalRecords(StartNumber, EndNumber)
If lngCountRecords > 0 Then
If lngCountRecords = lngCalRecords Then
If LastEnd = -1 Then
MsgBox "No Loss"
Exit Function
Else
'//后半区间
lngNextStart = EndNumber + 1
lngNextEnd = LastEnd
lngNextLast = LastEnd
End If
Else
'//前半区间
lngNextStart = StartNumber
lngNextEnd = CLng((EndNumber - StartNumber) / 2) + StartNumber
lngNextLast = EndNumber
End If
LossNumber = LossNumber(TableName, FieldName, lngNextStart, lngNextEnd, lngNextLast)
Else
LossNumber = StartNumber
End If
End Function
Public Function CountRecords(TableName As String, FieldName As String, StartNumber As Long, EndNumber As Long) As Long
Dim lngTotalRecords As Long
CountRecords = DCount(FieldName, TableName, FieldName & " >= " & StartNumber & " AND " & FieldName & "<=" & EndNumber)
End Function
Public Function CalRecords(StartNumber As Long, EndNumber As Long) As Long
CalRecords = EndNumber - StartNumber + 1
End Function
Access软件网QQ交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- 【Access高效办公】统计当...(06.30)
- 【Access高效办公】用复选...(06.24)
- 根据变化的日期来自动编号的示例...(06.20)
- 【Access高效办公】按日期...(06.12)
- 合并列数据到一个文本框的示例;...(05.06)
- 通过命令按钮让Access列表...(04.24)
- 【Access高效办公】统计当...(03.11)
- 【Access Inputbo...(03.03)
- 按回车键后光标移动到下一条记录...(02.12)

学习心得
最新文章
- Access快速开发平台--frm...(07.15)
- 1行代码实现Access与SQL ...(07.09)
- 免费《仓库管理实战课程》全集(07.08)
- Access快速开发平台--Win...(07.07)
- Access快速开发平台--执行有...(07.03)
- 【Access高效办公】统计当月之...(06.30)
- 【Access高效办公】用复选框控...(06.24)
- 根据变化的日期来自动编号的示例;根...(06.20)
- Access快速开发平台--Acc...(06.16)
- 【Access高效办公】按日期区间...(06.12)