软件工程面试内存分配

时间:2014-10-16 10:26:36

标签: java c memory

我正在研究这个我在网上找到SDE实习的问题。我想知道是否有人可以帮助解决这个问题,因为我很遗憾。我试图找出一种智能的方法将分配的内存地址和起始地址插入到hashmap中。我必须使用特定的哈希码吗?最好是在java中。提前谢谢!

假设您有2 ^ 32字节的内存。当程序要求分配内存时,会分配4kb的内存块。它可以在任何位置分配(例如0,57,8192)。现在假设我们有一个名为lookup()的函数,当给它一个任意地址时,(1)返回包含所请求地址的块的起始地址的值(如果已分配),或者(2)返回一个表示false的值如果没有分配块。查找必须在恒定时间内工作。为了帮助澄清功能,以下是一些预期行为示例:

Allocate(1) /* allocates bytes 1-4096 */
Allocate(4099) /* allocates bytes 4099-8194 */
Lookup(123) /* returns 1 */
Lookup(4096) /* returns 1 */
Lookup(4098) /* returns -1 or false */
Lookup(6042) /* returns 4099 */
Lookup(8198) /* returns -1 or false */

1 个答案:

答案 0 :(得分:1)

正如Mikkel K指出的那样,这个问题并不是很好。我假设他们希望你提供一个解决方案,让时间保持相当小。 这是我的建议:

分配:

对地址的20个最高位进行哈希处理。

如果一个块跨越2个哈希数(对于所有未在偶数4096字节上对齐的块都是如此),则将分配记录添加两次,两者都添加到哈希X列表和哈希X +列表中1。

查找

对地址的20个最重要位进行哈希处理。 获取与哈希值关联的分配记录列表。该列表将包含0,1或2个分配记录。

将返回列表中的分配记录的起始字节与参数中的地址进行比较,并确定它所属的分配记录(如果有)。