多维数组中查找最低密度位置 现有VB实现代码问题咨询
多维数组最低密度位置查找问题分析
现有代码缺陷
- 密度计算逻辑缺失:两个版本均未正确实现「密度」判断逻辑,你需求中的最低密度本质是行内已填充元素数量越少,对应可插入空位的列号越小,现有代码完全没有统计每行的填充率,仅随机判断相邻位状态。
- 边界情况漏判:半修复版本增加了
Uniques(Row).Length <> Column + 1的判断,直接排除了「行末空位」这种最常见的低密度场景,完全无法匹配示例2的情况。 - 优先级逻辑错误:初始版本同时要求行号和列号都小于当前记录值,会漏掉行号更大但列号更小的符合条件的位置;半修复版本仅比较列号大小,没有优先筛选密度最低的行,会出现高密度行列号更小就被误判为结果的问题。
- 功能逻辑矛盾:代码注释写的是「已处理的列就跳过」,但判断条件反而只处理ProcessedBits为1的列,逻辑完全相反。
修复方案
首先明确匹配示例的规则:
- 密度定义:每行已填充元素(ProcessedBits为1)的数量越少,该行密度越低
- 最低密度位置优先取:密度最低的行中,第一个未填充的位置(列号最小的0值位置,或行末的可扩展位置)
- 多行行密度相同时,取空位列号最小的位置
修复后代码
Public ProcessedBits()() As Byte ' 存储全局最小密度、目标行列索引(默认从0计数) Dim minDensity As Integer = Integer.MaxValue Dim nextLowestDensityColumn As Integer = Integer.MaxValue Dim nextLowestDensityRow As Integer = Integer.MaxValue For Row = 0 To Uniques.Length - 1 ' 计算当前行密度:已填充为1的元素数量 Dim currentRowDensity As Integer = ProcessedBits(Row).Count(Function(b) b = 1) ' 查找当前行第一个未填充的空位 Dim firstEmptyColumn As Integer = Array.IndexOf(ProcessedBits(Row), CByte(0)) ' 整行已填满的话,空位为行末下一个位置 If firstEmptyColumn = -1 Then firstEmptyColumn = ProcessedBits(Row).Length ' 优先级判断:先比密度更低,密度相同则比空位列号更小 If currentRowDensity < minDensity OrElse (currentRowDensity = minDensity AndAlso firstEmptyColumn < nextLowestDensityColumn) Then minDensity = currentRowDensity nextLowestDensityColumn = firstEmptyColumn nextLowestDensityRow = Row End If Next ' 找到目标位置后赋值,如果需要1开头的行列号,输出时各加1即可 If nextLowestDensityRow <> Integer.MaxValue Then Row = nextLowestDensityRow End If
内容的提问来源于stack exchange,提问作者SSpoke
相关产品推荐
相关产品推荐

