用二分法查找第一个断码的数字
时 间: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快速开发平台--Err...(08.12)
- Deepseek资料整理神器(08.11)
- 【Access财务分析示例】按月统...(08.08)
- Access查询里使用Date()...(08.05)
- 关于Access交叉表查询生成的统...(08.02)
- ACCESS做的工作日常小工具_纸...(07.30)
- Access快速开发平台进销存教程...(07.28)
- 关于Access快速开发平台2.6...(07.23)
- 【Access交叉表查询】按百分比...(07.21)
- VBA编程-ADO-关于对象早晚期...(07.17)