数据结构(C#)

线性表是有限个数据元素的序列。线性表的存储有顺序存储和链式存储两种。

为使线性表支持相同的API,定义了以下接口,分别用顺表和链表实现。

/*
* File   :  ILinerList.cs
* Author  :  Zhenxing Zhou
* Date   :  2008-12-06
* Blog   :  http://www.xianfen.net/
*/
using System.Collections.Generic;
namespace Xianfen.Net.DataStructure
{
   interface ILinearList<T> : I   {
     void Add(T t);
     void AddHead(T t);
     void AddTail(T t);
     void Clear();
     int Count { get; }
     int Find(T t);
     T GetAt(int pos);
     T GetHead();
     T GetTail();
     void InsertAt(T t, int pos);
     bool IsEmpty { get; }
     void RemoveAll();
     void RemoveAt(int pos);
     void RemoveHead();
     void RemoveTail();
     void SetAt(int pos, T t);
   }
}

本篇实现顺序表的存取。顺序表的存取有很多中实现方式。

线性表的顺序存储是指用一组地址连续的存储单元以此存储线性表的元素。两个逻辑相邻的元素在物 理上也是相邻的,能够快速取得指定索引的元素;但插入、删除元素时需要移动元素,效率较低;存储区 是连续的,长度一般不能在原存储区的基础上扩大,扩大存储区需要复制原来的元素。

代码实现:

/*
* File   :  SequentialList.cs
* Author  :  Zhenxing Zhou
* Date   :  2008-12-06
* Blog   :  http://www.xianfen.net/
*/
using System;
using System.Collections;
using System.Collections.Generic;

namespace Xianfen.Net.DataStructure
{
   public class SequentialList<T> : ILinearList<T>
   {
     private T[] m_List;
     private int m_Count;
     private int m_Capacity;

     public int Count
     {
       get { return m_Count; }
     }

     public bool IsEmpty
     {
       get { return m_Count == 0; }
     }

     public SequentialList()
       : this(16)
     {
     }

     public SequentialList(int capacity)
     {
       m_Count = 0;
       m_Capacity = capacity;
       m_List = new T[m_Capacity];
     }

     public void Add(T t)
     {
       InsertAt(t, m_Count);
     }

     public void AddHead(T t)
     {
       InsertAt(t, 0);
     }

     public void AddTail(T t)
     {
       Add(t);
     }

     public void Clear()
     {
       m_Count = 0;
     }

     public int Find(T t)
     {
       for (int i = 0; i < m_Count; i++)
       {
         if (m_List[i].Equals(t))
         {
           return i;
         }
       }

       return -1;
     }

     public T GetAt(int pos)
     {
       if (pos >= m_Count || pos < 0)
       {
         throw new IndexOutwww.0771ybgc.comOfRangeException("pos");
       }

       return m_List[pos];
     }

     public T GetHead()
     {
       return m_List[0];
     }

     public T GetTail()
     {
       return m_List[m_Count - 1];
     }

     public void InsertAt(T t, int pos)
     {
       if (pos > m_Count)
       {
         throw new IndexOutOfRangeException("pos");
       }

       if (m_Count == int.MaxValue)
       {
         throw new ArithmeticException();
       }

       EnsureCapacity();

       for (int i = m_Count - 1; i >= pos; i--)
       {
         m_List[i + 1] = m_List[i];
       }

       m_List[pos] = t;
       m_Count++;
     }

     public void RemoveAll()
     {
       Clear();
     }

     public void RemoveAt(int pos)
     {
       if (pos >= m_Count || pos < 0)
       {
         throw new IndexOutOfRangeException("pos");
       }

       for (int i = pos; i < m_Count; i++)
       {
         m_List[i] = m_List[i + 1];
       }

       m_Count--;
     }

     public void RemoveHead()
     {
       RemoveAt(0);
     }

     public void RemoveTail()
     {
       RemoveAt(m_Count - 1);
     }

     public void SetAt(int pos, T t)
     {
       if (pos >= m_Count || pos < 0)
       {
         throw new IndexOutOfRangeException("pos");
       }

       m_List[pos] = t;
     }

     // 空间不足时,重新分配足够大的空间,原内容复制到新的空间。
     // 分配算法类似与StringBuilder的空间再分配方式。
     private void EnsureCapacity()
     {
       if (m_Count + 1 > m_Capacity)
       {
         m_Capacity *= 2;

         if (m_Count + 1 > m_Capacity)
         {
           m_Capacity = m_Count + 1;
         }

         T[] tempArray = new T[m_Capacity];

         for (int i = 0; i < m_Count; i++)
         {
           tempArray[i] = m_List[i];
         }

         m_List = tempArray;
       }
     }

     public IEnumerator<T> GetEnumerator()
     {
       for (int i = 0; i < m_Count; i++)
       {
         yield return m_List[i];
       }
     }

     IEnumerator IEnumerable.GetEnumerator()
     {
       return GetEnumerator();
     }
   }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值