C中的高效数组查找
Efficient array lookup in C
我正在尝试为 C 中的自定义语言编写一个简单的语言解释器。由于 C 的简单性,我想在 C++ 上使用 C。
我不确定在 C 中如何做的事情是存储变量和变量查找。
我打算将变量存储在一个数组中,但我想我需要一个可变大小的数组。
除了循环遍历数组之外,我也不知道从数组中查找变量的有效方法。
所以我想知道,创建可变大小数组的有效方法是什么? Python 或 Ruby 或 Go 如何有效地存储和检索变量?
How does Python or Ruby or Go store and retrieve variables efficiently?
Python 和 Ruby 使用 hash-tables:变量的名称被翻译成一个整数,并且该整数用作数组的索引。几个名称总是会发生冲突(转换为相同的整数),因此需要通过允许在同一插槽中从名称到值的多个绑定来考虑这一点,但每个名称只会检查几个。
Go 是经过编译的,因此变量在编译时被转换为地址(静态地址或相对于堆栈或帧指针的偏移量)。
what is an efficient way of creating a variable sized array?
如果您决定这样做,您将使用 malloc
和 realloc
。
在调整哈希桶数组的大小的情况下-table,不幸的是,realloc
没有用,因为旧桶数组中的所有键都需要重新哈希一次一个找到他们在新数组中的位置。如果您知道将由您的解释器解释的程序的最大大小,您可以直接将 hash-table 分配为适用于最大程序的大小,并避免编写 hash-table 调整大小函数。
我认为当您尝试自己实现变量存储时,您可能会非常着迷。我建议您使用像 uthash 这样的现有散列图,只是为了看看它在概念上如何为您工作并尽可能好地封装它。如果结果是一个瓶颈,你可以稍后回来优化。
我有点自信的说,那个时候你不会挑动态扩容数组的。您必须考虑到您需要实现基于字符串的搜索以按名称查找变量,因此您将很难比具有动态扩展数组的哈希图做得更好。如果未排序,对其进行搜索将是 O(n),如果已排序,则搜索将是 O(log n),而 hashmap 具有 O(1) 搜索复杂度。
我正在尝试为 C 中的自定义语言编写一个简单的语言解释器。由于 C 的简单性,我想在 C++ 上使用 C。
我不确定在 C 中如何做的事情是存储变量和变量查找。
我打算将变量存储在一个数组中,但我想我需要一个可变大小的数组。
除了循环遍历数组之外,我也不知道从数组中查找变量的有效方法。
所以我想知道,创建可变大小数组的有效方法是什么? Python 或 Ruby 或 Go 如何有效地存储和检索变量?
How does Python or Ruby or Go store and retrieve variables efficiently?
Python 和 Ruby 使用 hash-tables:变量的名称被翻译成一个整数,并且该整数用作数组的索引。几个名称总是会发生冲突(转换为相同的整数),因此需要通过允许在同一插槽中从名称到值的多个绑定来考虑这一点,但每个名称只会检查几个。
Go 是经过编译的,因此变量在编译时被转换为地址(静态地址或相对于堆栈或帧指针的偏移量)。
what is an efficient way of creating a variable sized array?
如果您决定这样做,您将使用 malloc
和 realloc
。
在调整哈希桶数组的大小的情况下-table,不幸的是,realloc
没有用,因为旧桶数组中的所有键都需要重新哈希一次一个找到他们在新数组中的位置。如果您知道将由您的解释器解释的程序的最大大小,您可以直接将 hash-table 分配为适用于最大程序的大小,并避免编写 hash-table 调整大小函数。
我认为当您尝试自己实现变量存储时,您可能会非常着迷。我建议您使用像 uthash 这样的现有散列图,只是为了看看它在概念上如何为您工作并尽可能好地封装它。如果结果是一个瓶颈,你可以稍后回来优化。
我有点自信的说,那个时候你不会挑动态扩容数组的。您必须考虑到您需要实现基于字符串的搜索以按名称查找变量,因此您将很难比具有动态扩展数组的哈希图做得更好。如果未排序,对其进行搜索将是 O(n),如果已排序,则搜索将是 O(log n),而 hashmap 具有 O(1) 搜索复杂度。