数据结构--静态树表和索引顺序表的查找

数据结构--静态树表和索引顺序表的查找,第1张

一、静态树表的查找

对有序表的查找,如使用折半查找方法,是在“等概率”的前提下进行的,如果查找概率不一样,折半查找就不是最佳方法了。

举例:假设有序表有5条记录,且各记录的查找概率不等,分别为p1 = 01,p2 = 02,p3= 01,p4 = 04,p5 = 02,,则对此有序表进行折半查找,查找成功时的平均查找长度为

但是,如果在查找是令给定值先和第4个记录(这条记录查找概率高)进行比较,比较不相等时在继续在左子序列或右子序列中进行折半查找,则查找成功时的平均查找长度为

举例:

二、索引顺序表的查找

分块查找又称索引顺序查找,这是顺序查找的一种改进方法,在此查找法中,除表本身外,还要建立一个“索引表”,如下图

表中含有18个记录,分成三个子表(R1, R2, R6)(R7, R8, R12)(R13, R14, R18),对每个子表建立一个索引项,索引项包括两项内容:关键字项(其值为该子表内的最大关键字)和项指针(指示该子表的第一个记录在表中的位置)。索引表按关键字有序,则表或者有序,或者分块有序(分块有序:第二个子表中所有记录的关键字均大于第一个子表中的最大关键字,第三个子表中的所有关键字均大于第二个子表中的最大关键字,以此类推)。

因此,分块查找过程分两步:

1、确定待查记录所在块。2、在块中顺序查找

举例:

给定值K = 38,先将K依次和索引表中最大关键字进行比较,因为22 < K < 48,则关键字为38的记录若存在,必在第二个子表中,第二个子表的索引项的项指针,指向第二个子表的第一个记录是表中的第7个记录,所以从第7个记录开始进行顺序查找,直到查到r[10]key = K为止,若K = 29,从第7个记录查到第12个记录都没有比较成功,则查找失败。

由于由索引项组成的索引表按关键字有序,则确定块的查找可以用顺序查找,也可以用折半查找,若块中的记录是任意排列的,则只能用顺序查找了。

分块查找的平均查找长度为:查找索引表的平均查找长度 + 在块中查找元素的平均查找长度。

下面是关于数据库索引的相关知识:

简单来说,数据库索引就是数据库的数据结构!进一步说则是该数据结构中存储了一张表中某一列的所有值,也就是说索引是基于数据表中的某一列创建的。总而言之:一个索引是由表中某一列上的数据组成,并且这些数据存储在某个数据结构中。

2索引的作用。举个例子,假设有一张数据表Emplyee,该表有三列:

表中有几万条记录。现在要执行下面这条查询语句,查找出所有名字叫“Jesus”的员工的详细信息

3如果没有数据库索引功能,数据库系统会逐行的遍历整张表,对于每一行都要检查其Employee_Name字段是否等于“Jesus”。因为我们要查找所有名字为“Jesus”的员工,所以当我们发现了一条名字是“Jesus”的记录后,并不能停止继续查找,因为可能有其他员工也叫“Jesus”。这就意味着,对于表中的几万条记录,数据库每一条都要检查。这就是所谓的“全表扫描”( full table scan)

4而数据库索引功能索引的最大作用就是加快查询速度,它能从根本上减少需要扫表的记录/行的数量。

5如何创建数据库索引。可以基于Employee表的两列创建索引即可:

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

2索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

3索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。

4例如这样一个查询:select from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

5从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持

参考资料:

数据库索引-百度百科

ComponentGetComponentInChildren 获取子物体组件function GetComponentInChildren (t : Type) : Component 返回Type类型组件,在GameObject或它的任何子物体使用深度优先搜索,仅返回激活的组件。var gameObj:Seek;var obj :GameObject;obj = GameObjectFind("xxxx");gameObj = objGetComponentInChildren (Seek);意思就是说,如果要获取的对象是seek类型,我们可以先获取它的GameObject,然后用它的GameObject在获取所需类型。(相当与C#中的类型转换)

叉放到叉车下面作为叉车的子物体,代码里控制叉移动或者旋转比如position前面加上local,也就是localposition

这里只是用position作为例子啊,其他的比如rotation同上,position是相对世界坐标的移动,而localposition是相对父物体的坐标移动

假设你的脚本是添加到的子物体上的,可以直接用transformparentgameObject; 这个是你获取到的父物体

如果你的脚本不是添加在子物体上的,那么你需要通过"子物体transformparentgameObject"获得

另外,建议场景中的物体很多的时候最好不要用gameObjectFind()来寻找某个对象,这样会遍历场景中所有未被隐藏的物体,直到找到所符合的物体 另外,如果场景中的物体有重名的,可能会获取非意愿中的目标

1GameObjectFind()

通过场景里面的名子或者一个路径直接获取游戏对象。

GameObject root = GameObjectFind(“GameObject”);

我觉得如果游戏对象没再最上层,那么最好使用路径的方法,因为有可能你的游戏对象会有重名的情况,路径用“/”符号隔开即可。

GameObject root = GameObjectFind(“GameObject/Cube”);

GameObjectFind()使用起来很方便,但是它有个缺陷如下图所示,就是如果你的这个GameObject天生acive = false的话。那么你用GameObjectFind()是永远也无法获取它的对象的。如果对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。

就这个问题我查过很多资料,最终也无果。。但是我用另外一个巧妙的办法可以解决它。(后面详解)或者你也可以提前把所有的游戏对象保存在内存中。

GameObjectFind()方法在游戏中的使用频率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用类似递归的形式来做的,那么我们就要尽量更少的调用GameObjectFind()方法,可以把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤其是在Update方法中不要去 Find()游戏对象!!

2 TransformFind()

还记得上面我说过用GameObject无法获取天生acive = false的游戏对象,如果你用TransformFind()的话就可以很好的获取,另外Unity还提供了一个TransformFindChind()的方法,这个方法未来会被unity废弃,大家最好就别用了,用TransformFind()可以取代。

如下代码,我们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,无论”xxxx”对象是否active = true 都是可以直接找到对象的。

值得注意的是,unity规定了比如父节点active = true 并且子节点的 active = true 都满足的情况下 才能全部显示。使用TransformFind()可以很方便的获取游戏对象,因为有了游戏对象,那么它身上的脚本啊组件啊什么的都可以很方便的获取到。

但是TransformFind()必须要保证你的顶级父对象的activity = true。举个例子,你做了一个场景有一些地图你在场景里面预先activie = false了, 你希望在游戏中的某个时间点把它们都打开 setActive(true)

你可以把“map”节点放在一个active = true的GameObject上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。

GameObject root = GameObjectFind(“GameObject”);

GameObject map = roottransformFind(“map”)gameObject;

mapSetActive(true);

3 unity 还提供了几个获取游戏对象的方法,但是我个人觉得使用频率不高,这里也简单说两句。

GameObjectFindGameObjectsWithTag(“tag”)

GameObjectFindWithTag(“tag”)

根据一个标记来获取游戏对象,返回一个 或者 一个数组,我个人觉得这个两个方法没啥用,因为既然需要用到标记那么相比这个游戏对象必然是非常特殊的一个,所以我会把它存在内存中。

ObjectFindObjectOfType

ObjectFindObjectsOfType

ResourcesFindObjectsOfTypeAll

根据一个类型返回Object,比如 GameObject 、Texture、Animation 、甚至还可以是你自己写的一个脚本 的范型。它找起来很方便,可以返回一个 或者一个数组。 我觉得这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,比如你要做批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。

还有一个方法,如果你知道自对象的索引,还可以用下面的方法来获取,参数是index的索引。

transformGetChild(0)

你可以使用Python中的内置函数 min() 或 max() 来获取二维列表中最大/小值对应的子列表。

举个例子,如果你有一个二维列表 matrix,并希望获取其中和最大的子列表。

你可以使用以下代码:

max_sublist = max(matrix, key = sum)

这段代码将会使用 sum 函数来计算每个子列表的和,并返回和最大的子列表。

如果您希望获取最小值对应的子列表,只需要把 max() 改成 min()就可以了。

同理,如果你想获取最大/小值对应的子列表并且最大/小值是二维列表中的某个元素。

比如:

matrix = [[1,2,3],[4,5,6],[7,8,9]]

max_sublist = max(matrix, key = lambda x : max(x))

这样就可以获取到二维列表中最大值所在的子列表。

请注意,这只是一种做法,并非唯一做法。您可能需要根据自己的需求来进行调整。

在C4D中,要使其他物体跟随一个扭曲变形的物体运动,但不发生变形,可以使用约束对象(Constraint Object)。具体步骤是:1 添加约束对象。在Object Manager里点击Constraint Tag(约束标签),选择一个合适的约束类型,如HierarchyConstraint(层级约束)。2 设置约束对象的目标物体。选中步骤1添加的约束对象,在Attributes面板中找到Targets选项,点击Add Target按钮,选择需要跟随运动的物体,添加为目标物体。3 设置约束对象的参数。主要调整Position Strength和Rotation Strength,Position Strength控制目标物体跟随主物体的位置变化程度,Rotation Strength控制目标物体跟随主物体的旋转变化程度。这两个值为100%时,目标物体完全跟随主物体。4 为目标物体添加子物体。为确保目标物体不发生变形,需要将其本身作为父物体,新添加一个子物体作为其可见物体。选中目标物体,右键选择Current State to Object,再将新生成的子物体置于该父物体下方。5 调整子物体的参数。进入子物体的Attribute面板,取消其与父物体的相对变换关系(Make Independent),这时子物体的运动不再跟随父物体。同时在三个坐标轴上设置Pivot模式为Individual Centers。6 在Timeline中移动主物体,目标物体即会跟随其运动,但子物体保持不变形。这样通过使用约束对象,目标物体本身只控制子物体的运动变化,实现了跟随主物体的运动且不变形的效果。可以通过修改约束对象的各项参数,调节运动跟随的度合,实现所需的效果。

以上就是关于数据结构--静态树表和索引顺序表的查找全部的内容,包括:数据结构--静态树表和索引顺序表的查找、数据库索引是什么,有什么用,怎么用、如何获取GameObject子对象的脚本等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9723748.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存