unity数据结构

Array 数组

在c#语言中,数组是最简单的数据结构,具有以下3个特点  

(1) 数组储存在连续的内存上;

(2)数组的元素都是相同类型或者类型的衍生类型,因此数组又被认为是同质数据结构

(3)数组可以直接通过下标访问。array[i]来访问;

 常规操作:

(1)分配储存空间, 声明一个新的数组 int[]arr=new int[5];

(2) 访问数组中的元素数据,通过下标获取某个元素;int i= arr[0];

Mono运行时的托管堆中分配一块连续的内存空间盛放数量为size,连续内存上储存,索引快,两个元素插入之间便不方便;


Arraylist数组

不必声明数组长度,可以储存不同类型元素,

每个元素为obj来处理;(不安全) 插入值类型会发生装箱操作,索引取值时会发生拆箱操作;


list<T>

工作时常用,和Arraylist相似,在声明list集合时,需要指定内部数据的存储类型,

List<string> test =new List<string>();

test.Add("abc");

test[0]="def";

test.RemoveAt(0);

确保类型安全, 类型安全;

取消装箱拆箱 高性能;

可以快速访问,灵活变化


LinedList<T>

链表

U3D中 已经封装好了

LinkedList<T> 链表类 双向列表 Next  Previous

LinkedListNode<T> 链表节点

AddFirst 将一个新节点加入该链表的第一个节点位置;

AddLast 将一个新节点加入该链表的最后一个节点位置;

AddBefore 在某个节点前插入新节点

AddAfter 在某个节点后插入新节点;

RemoveFirst 移除第一个节点;

RemoveLast 移除最后一个节点;

Remove 移除指定节点;


队列 &栈

队列,特殊的线性表,(FIFO)先进先出, 像是在超市买菜排队结账;3

初始容量为32

允许在前端 head删除, 而在后端 tail 进行插入 

插入操作,队尾, 删除操作,队头

c# U3D Queue<T>

Queue<string> number = new Queue<string>();
 number.Enqueue("one");//插入操作
 number.Enqueue("Two");

 number.Dequeue(); //删除操作

 栈 又名堆栈

形象一点就是 把东西堆起来, 先堆进去的最后出来。是也(LIFO)后进先出;

c# U3D Stack<T>

一样是运算受限制的线性表 仅允许在表的一端进行插入 删除运算,栈顶, 栈底,

插入叫进栈 入栈 压栈,把新元素放到栈顶,删除元素 称 出栈 退栈,把顶元素删除,

Stack<T>类有个 push 和pop方法;

peek//  看顶部元素, 偷看。。。

  Stack<string> number2 = new Stack<string>();

.peek//  看顶部元素, 偷看。。。

number2.Push("abc"); //入栈

 number2.Push("efg"); //出栈

 number2.Pop(); //此时删除的是efg、

 
 

number2.peek//  看顶部元素, 偷看。。。

count总数,    如果Stack<T>中元素数量count小于其容量,Push操作时间复杂度为O(1);

如果容量需要被扩展,根据需要来重新分配内部数组以自动增大容量,这种情况下Push操作复杂度为O(n),出栈操作Pop操作复杂度为O(1);

Hash Table(哈希表) Dictionary<K,T> 字典

键值对

哈希表 散列表

根据关键码/值(key/value)直接进行访问的数据结构,通过关键码/值映射到表中的一个位置来访问记录,加快查找速度;

C#提供两种机制

冲突避免机制

冲突解决机制

冲突解决策略为开放寻址法

最简单的实现一种就是 线性探查,3个步骤

1 插入新元素时, 使用哈希函数在哈希表中定位元素位置。

2 检查哈希表中该位置是否已经存在元素。如果该位置内容为空,插入并返回,否认执行3

3 如果该位置为i,则检查i+1是否为空,如果已被占用,而检查i+2。依次类推,直到找到为空。

会导致同类哈希的聚集

改进方式为二次探查

每次检查位置空间的步长为平凡倍数,如果位置s被占用,而首先检查s+12处,然后检查 s-12 s+22 s-22 s+32 s-32......

但同样也会导致同类哈希聚集问题

Hashtable herosDic = new Hashtable();

        herosDic.Add("111-11-1234", "Hero1");
        herosDic.Add("111-12-1234", "Hero2");
        herosDic.Add("111-13-1237", "Hero3");
        herosDic.Add("111-14-1235", "Hero4");
        herosDic.Add("111-15-1235", "Hero5");


        if (herosDic.ContainsKey("111-11-1234"))
        {
            string heroName = (string)herosDic["111-11-1234"];
            Debug.Log("ID111-11-1234" + heroName);
        }
        else {
            Debug.Log("111-11-1234不存在");
        }

ContainsKey

ContainsValue

remove(key)

来源 小黄书

Dictionary<K,T> 字典

 Dictionary<string, int> student = new Dictionary<string, int>();

        student.Add("xiaoming", 0);
        student.Add("xiaohong", 1);
        student.Add("xiaobing", 2);

        foreach (var itme in student) {
            Debug.Log("val"+itme.Value + "key"+itme.Key);
        }
        student.Remove("xiaoming");
        //缺点就是耗 内存空间 慎用



猜你喜欢

转载自blog.csdn.net/qq2512667/article/details/79876117