兩種查找算法的比較

一、普通查找:雙層循環遍歷,第二層循環中找到即break,查找時間複雜度O(M*N/2)ide

List<PtCameraInfo> cameraList = new List<PtCameraInfo>();
List<string> cameraIdList = dataIds.Split(',').ToList();
List<PtCameraInfo> oldList = this.cameraList.Cameras.ToList();

for (int i = 0; i < cameraIdList.Count; i++)
{
    string cameraId = cameraIdList[i];
    for (int j = 0; j < _cameraList.Count; j++)
    {
        PtCameraInfo camera = _cameraList[j];
        if (camera.ID == cameraId && !oldList.Exists(a => a.ID == camera.ID))
        {
            cameraList.Add(camera);
            break;
        }
    }
}
View Code

二、高效查找:排序雖然費時,但數量級低,因此耗時很低,排序時間複雜度O(M*logM+N*logN),查找過程也是雙層循環,但第二層循環比較省時,查找時間複雜度O(M*logN),總的時間複雜度:O(M*logM+N*logN+M*logN)this

List<PtCameraInfo> cameraList = new List<PtCameraInfo>();
List<string> cameraIdList = dataIds.Split(',').ToList();
List<PtCameraInfo> oldList = this.cameraList.Cameras.ToList();

//排序
this._cameraList.Sort(new Comparison<PtCameraInfo>((a, b) =>
{
    return string.Compare(a.ID.PadLeft(36, '0'), b.ID.PadLeft(36, '0'));
}));
cameraIdList.Sort((a, b) =>
{
    return string.Compare(a.PadLeft(36, '0'), b.PadLeft(36, '0'));
});

//高效查找
int k = 0;
for (int i = 0; i < cameraIdList.Count; i++)
{
    string cameraId = cameraIdList[i];
    for (int j = k; j < _cameraList.Count; j++)
    {
        PtCameraInfo camera = _cameraList[j];
        if (camera.ID == cameraId && !oldList.Exists(a => a.ID == camera.ID))
        {
            cameraList.Add(camera);
            k = j;
            break;
        }
    }
}
View Code

說明:cameraList的數量級是2萬,當cameraIdList數量從1到大約1000時,高效查找耗時始終是0.1秒多左右,而普通查找,當cameraIdList數量不多時,很快,0.05秒,當cameraIdList數量接近1000時,大約2秒。spa

相關文章
相關標籤/搜索