Unity游戏开发客户端面经——数据结构(初级)

本文是关于Unity游戏开发面试中的数据结构部分,涵盖了栈与堆的区别、栈溢出的原因、Stack和Queue的对比、链表的类型与优缺点、数组与链表的对比、二叉树的深度计算及遍历、List和字典的实现原理及性能分析。通过这些内容,有助于理解面试中常问的数据结构问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习。由于文本太多,按类型分开。这一篇是数据结构常问问题总结,有帮助的可以收藏。


1.栈和堆的区别:

  1. GC方面:栈保持着先进后出的原则,是一片连续的内存域,有系统自动分配和维护,产生的垃圾系统自动释放。而堆是无序的,他是一片不连续的内存域,用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
  2. 存储方面:栈通常保存着我们代码执行的步骤,如方法变量等等。而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子(越高内存地址越低)。当我们使用的时候,每次从最顶部取走一个盒子,当一个方法(或类型)被调用完成的时候,就从栈顶取走接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
  3. 缓存方面:栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
  4. 存储方面:栈(Stack)是一种先进后出的数据结构,在内存中,变量会被分配在栈上来进行操作。堆(heap)是用于为引用类型的实例(对象),分配空间的内存区域,在堆上创建一个对象,会将对象的地址传给栈上的变量(反过来叫变量指向此对象,或者变量引用此对象)-----也就是栈上的变量指向了堆上地址为XXX的实例(对象)。

2.栈溢出一般是由什么原因导致的

  1. 无限递归。函数递归调用时,系统要在栈中不断保存函数调用时的现场和产生的变量,如果递归调用太深,就会造成栈溢出,这时递归无法返回。再有,当函数调用层次过深时也可能导致栈无法容纳这些调用的返回地址而造成栈溢出。
  2. 无限循环。
  3. 大量局部变量分配。

3.Stack栈和Queue队列

    相同点:

  1. 都是线性结构。
  2. 插入操作都是限定在表尾进行。
  3. 都可以通过顺序结构和链式结构实现。
  4. 插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
  5. 多链栈和多链队列的管理模式可以相同。
  6. 底层都是由泛型数组实现。

    不同点:

  1. 栈先进后出,队列先进先出:删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
  2. 顺序栈能够实现多栈空间共享,而顺序队列不能。
  3. 应用场景不同

常见栈的应用场景包括

  1. 括号问题的求解,
  2. 深度优先搜索遍历等;
  3. 函数调用和递归实现,
  4. 表达式的转换和求值

常见的队列的应用场景包括

  1. 计算机系统中各种资源的管理,
  2. 消息缓冲器的管理
  3. 广度优先搜索遍历等

4.链表

        单双向链表的区别:

        指向不同:单向链表只有一个指向下一结点的指针,双向链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针。

        功能不同:单向链表只能next ,双向链表可以return。

        单双向不同:单链表只能单向读取,双向链表可以双向遍历。

        单向链表优缺点:

         优点:单向链表增加删除节点简单。遍历时候不会死循环;

         缺点:只能从头到尾遍历。只能找到后继,无法找到前驱,也就是只能前进。

        双向链表优缺点:

        优点:可以找到前驱和后继,可进可退;

        缺点:增加删除节点复杂,多需要分配一个指针存储空间。

        

                        s->prior=p; s->next=p->next; p->next->prior=s; p->next=s;

        例题:遍历一遍找到链表倒数第 k 个元素

        由于单链表只能从头到尾依次访问链表的各个节点,所以如果要找链表的倒数第 k 个元素,也只能从头到尾遍历查找。

C语言的数据结构经主要包括C语言基础、操作系统、计算机网络、数据结构算法、设计模式等内容。 在C语言的经中,C++的增强特性也是常见的一部分,比如引用、类与对象、模板、智能指针等,还有STL模板库等。这些特性使得C++的使用更加便捷和安全。 此外,C++11引入了一些新特性,比如std::enable_if和SFINAE。SFINAE是Substitution failure is not an error的缩写,意思是匹配失败不是错误。简单来说,当调用模板函数时,编译器会根据传入参数推导最合适的模板函数,在这个推导过程中,如果某些模板函数的推导结果是编译无法通过的,只要有一个可以正确推导出来的模板函数,那些推导结果可能引发编译错误的模板函数并不会导致整个编译错误。 在试中,还会涉及到指向数据成员的指针。C++中可以使用指向类成员函数的指针来调用函数,也可以使用指向类数据成员的指针来访问数据成员。 多线程也是试中常见的一个话题,关于多线程的问题,需要考虑线程安全性。在C++中,需要采取一些措施来保证线程安全,比如使用互斥锁、条件变量等。 综上所述,C语言的数据结构经主要围绕C语言基础、操作系统、计算机网络、数据结构算法、设计模式等内容展开,并且会涉及到C++的一些增强特性,以及指向数据成员的指针和多线程的相关知识。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C++开发工程师经总结](https://blog.csdn.net/Arcofcosmos/article/details/127156504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [2020秋招_C++基础、数据结构基础经记录](https://blog.csdn.net/XindaBlack/article/details/107120742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值