最近在研究 C++ 或C# 找出最接近的数 仅做记录 便于以后追溯
C#
Dictionary<int, double> dirNew = new Dictionary<int, double>();
Dictionary<int, double> dirNewValue = new Dictionary<int, double>();
foreach (var vApp in directoryApp)
{
//directoryOther为 Dictionary<int, double>
var v = directoryOther.Values.Select((d, i) =>{
return new
{
Value = d,
Index = i
};
}).OrderBy(x => Math.Abs(x.Value - vApp.Value)).First().Index;
dirNew.Add(vApp.Key, directoryOther.FirstOrDefault(q => q.Value == directoryOther[v]).Key);
dirNewValue.Add(vApp.Key, directoryOther[v]); //这里就找到两个集合中 最接近的数
}
C++ 根据给定的值 找出map中Value最近的数
//m_mapApp , m_mapping 类型 map<int,double>;
int nAppMapSize = m_mapApp.size();
for(int i = 0 ;i < nAppMapSize; i ++)
{
m_mapping[i] = BinySearch(i,m_mapApp[i]);
printf("%d===%d\r\n",i, m_mapping[i]);
}
// int nCur 循环中的循环具体值 key需要查找的数
int BinySearch(int nCur,double key)
{
int nSize = m_mapRoutine.size();
int nRight = nSize;
int nLeft = 1;
int mid = 0;
int nTemp = 0;
for(int i = 0 ;i < nSize;i ++)
{
while(nLeft <= nRight)
{
mid = (nLeft + nRight) / 2;
//m_mapRoutine map<int,double>
if (m_mapRoutine[mid] <= key) nLeft = mid + 1;
else nRight = mid - 1;
}
if (abs(m_mapRoutine[nRight] - key)>fabs(m_mapRoutine[nLeft] - key))
{
nTemp = nLeft;
break;
}else
{
nTemp = nRight;
}
break;
}
if (nTemp >= 255)
{
nTemp = 255;
}
return nTemp;
}