关于地址映射排序法
vb吧
全部回复
仅看楼主
level 11
余思培 楼主
30多年前就有大佬专门研究过了,而我现在却因为写出来一种比较快的排序方法而沾沾自喜。
//本来想的是汇编化我之前写的映射排序,同时也想看看有什么方法可以改进内部排序问题,于是想到网上找一找其他例子......然后就翻到了这一篇文章......不得不说,比起我这种碰运气写出映射排序代码的人,大佬终究还是大佬
2021年04月05日 17点04分 1
level 11
余思培 楼主
知网链接如下:
https://wap.cnki.net/touch/web/Journal/Article/JSGG198607006.html
2021年04月05日 17点04分 2
level 11
余思培 楼主
原文如下
2021年04月05日 17点04分 3
level 11
余思培 楼主
但我发现对映射排序的研究多集中在十数年前乃至数十年前......
2021年04月05日 17点04分 4
但是除了这些通用语言,我记得还有专门用于描述算法的专用语言。那个时候类似于中华哲学在春秋时代的样子。
2021年04月06日 02点04分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 应该说是使用编程语言的人员基数变大了,尤其又以热门语言学习者和使用者居多,所以其实只是各种其他专业性、针对性、特殊性的语言就在视野之中淡了
2021年04月06日 05点04分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 但是现在好像研究算法(数学逻辑方向)的,大多使用MATLAB等专业数学分析、编程软件
2021年04月06日 05点04分
@余思培 也算作是描述算法的语言......吧?
2021年04月06日 05点04分
level 11
余思培 楼主
关键字:
分布式排序、线性排序、地址映射、链接
已知优化:
子域映射排序
已知特点:
当排序的数据量与排序数值范围接近时(理想状态为每一个值刚好都只映射到一个地址中),排序速度基本为线性时间
在数据量不变的情况下,数值范围越大,相对排序速度越快,反之则会更慢
地址映射排序基本不受待排数据的有序程度影响,反之非常受待排数据的分布情况影响,待排数据分布越均匀,则排序速度越快,反之若越集中,则排序速度越慢(这是因为地址映射排序在此情况下碰撞次数增多,需要增加内部排序的开销,弱化了其排序特点。)
2021年04月05日 17点04分 5
level 11
余思培 楼主
之前写的一个地址映射排序
2021年04月05日 18点04分 6
level 11
牛顿和莱布尼茨,分别研究微积分
都一样伟大。
你也是。
2021年04月06日 02点04分 7
level 13
我对算法要求不高,主要是差不多了就行,也知道VB本身的原因很难达到一个高度。VB的数组其实就是SafeArray,而操作变量比操作数组快好几倍,由于VB不像C++那样可以用指针(VB也就模拟指针SafeArray),一个大的循环,尤其数据量大的(一般操作数组的元素都是几十万个,甚至上百万),就算只是(累加)或(异或)数组元素都需要不少时间,有些加密的东西为了解密时加载快,都只用了简单的加密方法(也正应了那句“鱼与熊掌不能兼得”,加密必然要付出时间的代价,不加密又很容易让别人看到明文)。
Private Declare Sub GetArrayPtr Lib "MSVBVM60.DLL" Alias "GetMem4" (ptr() As Any, retVal As Any) '对GetMem4的第一个参数改造成数组
Private Declare Sub GetMem4 Lib "MSVBVM60.DLL" (ptr As Any, retVal As Any)
Dim lpSave As Long
Dim dwSave() As Long
ReDim dwSave(0)
Call GetArrayPtr(dwSave, lpSave) '轻松得到dwSave数组的指针
'之前我发的帖子里没有调用GetMem4得到数组指针的,这个方法应该比你的MemCopy+VarPtr+VarPtrArray快不少,也显得简便
2021年04月06日 03点04分 8
GetMem和PutMem是最近才学会的,之前写的时候不知道
2021年04月06日 04点04分
level 13
Private Declare Sub GetArrayPtr Lib "MSVBVM60.DLL" Alias "GetMem4" (ptr() As Any, retVal As Any) '对GetMem4的第一个参数改造成数组
Private Sub Form_Load()
Dim ee() As Long
Dim ptr As Long
Call GetArrayPtr(ee, ptr) '也可以快速判断数组是否为空
If ptr = 0 Then Debug.Print "数组未初始化"
ReDim ee(11)
Call GetArrayPtr(ee, ptr)
If ptr Then Debug.Print "数组已初始化"
End Sub
2021年04月06日 03点04分 9
还有这种操作?不过还是ptrVarArray用的顺手一点(习惯[结果]=[表达式]的形式)
2021年04月06日 04点04分
@余思培 [哈哈]GetMem4得到数组变量处的4字节就是指向SafeArray结构的指针,所以GetMem4的用处很多,对SafeArray操作很方便
2021年04月06日 06点04分
level 13
2021年04月06日 03点04分 10
SafeArray.pvData存储的才是真正指向数组元素的首地址
2021年04月06日 03点04分
@隨風🍁缒夢 自从您那次提到过safearray后,我就去了解并学习了一下,所以我的代码里其实已经+了12,修改了pvData
2021年04月06日 04点04分
@余思培 你是用了SafeArray指针后加固定偏移也是可以的,只是理解上麻烦
2021年04月06日 07点04分
1