php如何在数组和哈希表上工作

在数组和哈希表上工作

在C语言中, 有两种不同的基础方法用来在一个结构体中存储任意数量的独立数据元素. 两种方法都有赞成者和反对者.

向量 Vs. 链表

应用的编写通常基于特定类型数据的特性的选择, 需要存储多少数据, 以及需要多快速度的检索. 为了能够有对等的认知, 我们先来看看简单的看看这些存储机制.

向量

向量是一块连续的内存空间, 它们包含的数据有规律的间隔. 向量最常见的例子就是字符串变量(char *或char []), 它包含了一个接着一个的字符(字节)序列.

char foo[4] = "bar";

这里, foo[0]包含了字符'b'; 紧接着, 你将在foo[1]中找到字符'a', 最后在foo[3]中是一个空字符'\0'.

将指向其他结构的指针存储到向量中的用法几乎是无所不在的, 比如在上一章, 使用zend_get_parameters_array_ex()函数时, 就使用了一个zval的向量. 那里, 我们看到var_dump()定义了一个zval ***的函数变量, 接着为它分配空间用来存储zval **指针(最终的数据来自zend_get_parameters_ex()调用)

zval ***args = safe_emalloc(ZEND_NUM_ARGS(), sizeof(zval**), 0);

和访问字符串中的数组一样, var_dump()实现中使用args[i]依次传递每个zval **元素到内部函数php_var_dump().

向量最大的优点在于运行时单个元素的访问速度. args[i]这样的变量引用, 可以很快的计算出它的数据地址(args + i * sizeof(args[0]). 这个索引结构的空间分配和释放是在单次, 高效的调用中完成的.

链表

另外一种常见的存储数据的方式是链表. 对于链表而言, 每个数据元素都是一个至少有两个属性的结构体: 一个指向链表中的下一个节点, 一个则是实际的数据. 考虑下面假设的数据结构:

typedef struct _namelist namelist;
struct {
    struct namelist *next;
    char *name;
} _namelist;

使用这个数据结构的引用需要定义一个变量:

static namelist *people;

链表中的第一个名字可以通过检查people变量的name属性得到: people->name; 第二个名字则访问next属性: people->next->name, 依此类推: people->next->next->name等等, 直到next为NULL表示链表中已经没有其他名字了. 更常见的用法是使用循环迭代链表:

void name_show(namelist *p)
{
    while (p) {
        printf("Name: %s\n", p->name);
        p = p->next;
    }
}

这种链表非常适合于FIFO的链式结构, 新的数据被追加到链表的末尾, 从另外一端线性的消耗数据:

static namelist *people = NULL, *last_person = NULL;
void name_add(namelist *person)
{
    person->next = NULL;
    if (!last_person) {
        /* 链表中没有数据 */
        people = last_person = person;
        return;
    }
    /* 向链表末尾增加新的数据 */
    last_person->next = person;  

    /* 更新链表尾指针 */
    last_person = person;
}
namelist *name_pop(void)
{
    namelist *first_person = people;
    if (people) {
    people = people->next;
    }
    return first_person;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 变量
, next
, 哈希
, 向量
, 链表数组
, 一个
, 哈希调用例子
php哈希表
哈希表和数组的区别、数组 链表 哈希表、哈希表 数组、哈希表 数组的交集、数组实现哈希表,以便于您获取更多的相关知识。

时间: 2024-08-31 12:48:55

php如何在数组和哈希表上工作的相关文章

PHP关联数组与哈希表(hash table) 不指定

PHP中有一种数据类型非常重要,它就是关联数组,又称为哈希表(hash table),是一种非常好用的数据结构. 在程序中,我们可能会遇到需要消重的问题,举一个最简单的模型: 有一份用户名列表,存储了 10000 个用户名,没有重复项: 还有一份黑名单列表,存储了 2000 个用户名,格式与用户名列表相同: 现在需要从用户名列表中删除处在黑名单里的用户名,要求用尽量快的时间处理. 这个问题是一个小规模的处理量,如果实际一点,2 个表都可能很大,比如有 2 亿条记录. 我最开始想到的方法,就是做一

Programming Ruby——数组,哈希表和控制结构

数组和哈希表 Ruby的数组和哈希表是索引集合.两都都是保存对象集合并能通过键来读取.数组的键是数字,但是 哈希表则支持对象作为键.它们都是随着新元素的加入要增长.在访问元素方面,数组效率比较高,但哈 希表更加的灵活.无论是数组还是哈希表,都能保存不同类型的对象:你可以使用一个数组保存数字,字 符串和浮点数,就像你等会将会看到的那样. 你可以使用数组文本来创建和初始化一个新的数组--一个由中括号包围的元素集合.对于一个数组 ,你能通过使用中括号间的数字来获取每个元素,就如例子所演示的那样.要注意

【探索PowerShell 】【八】数组、哈希表

我们经常在程序设计中用到的数组,同样在脚本中很常用.本节就详细介绍一下数组,以及哈希表在PowerShell中的使用. 数组 在PowerShell中,声明一个变量为数组时,需要使用符号"@",例如: $strUsers=@(""user1","user2","user3) <enter> 这样,我们就声明了一个具有3个成员的数组.查看它的值,使用: $strUsers <enter> 还有一些其他的操

浅谈算法和数据结构 十一 哈希表

在前面的系列文章中,依次介绍了基于无序列表的顺序查找,基于有序数组的二分查找,平衡查找树,以及红黑树,下图是他们在平均以及最差情况下的时间复杂度: 可以看到在时间复杂度上,红黑树在平均情况下插入,查找以及删除上都达到了lgN的时间复杂度. 那么有没有查找效率更高的数据结构呢,答案就是本文接下来要介绍了散列表,也叫哈希表(Hash Table) 什么是哈希表 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值. 哈希的思路很简单

哈希表

定义 一般的线性表.树,数据在结构中的相对位置是随机的,即和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较.这一类查找方法建立在"比较"的基础上,查找的效率依赖于查找过程中所进行的比较次数. 若想能直接找到需要的记录,必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应,这就是哈希表. 哈希表又称散列表.哈希表存储的基本思想是:以数据表中的每个记录的关键字 k为自变量,通过一种函数H(k)计算出

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性能分析 NXHashTable 的作用 NXHashTable 的实现有着将近 30 年的历史,不过仍然作为重要的底层数据结构存储整个应用中的类. 文中

哈希表工作原理

1. 引言        哈希表(Hash Table)的应用近两年才在NOI中出现,作为一种高效的数据结构,它正在竞赛中发挥着越来越重要的作用. 哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间:而代价仅仅是消耗比较多的内存.然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的.另外,编码比较容易也是它的特点之一.        哈希表又叫做散列表,分为"开散列" 和"闭散列".考虑到竞赛时多数人通常避免使用动态存储结

Windows Powershell使用哈希表_PowerShell

哈希表存放的是对,在哈希表中不再仅仅限制使用数字寻址,可以使用任意类型的数据类型寻址. 创建哈希表 之前使用@()创建数组,现在使用@{}创建哈希表,使用哈希表的键访问对应的值. PS C:Powershell> $stu=@{ Name = "小明";Age="12";sex="男" } PS C:Powershell> $stu Name Value ---- ----- Name 小明 Age 12 sex 男 PS C:Pow

将一个二维数组转换为 hashmap 哈希表

/**  * 将一个二维数组转换为 hashmap  *  * 如果省略 $val 参数,则转换结果每一项为包含该项所有数据的数组.  *  * @param array $arr  * @param string $keyField  * @param string $val  *  * @return array  */ function arrHash(& $arr, $keyField, $val = null) {     $ret = array();     if ($val) {