微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我很难加速我的 HashMap

如何解决我很难加速我的 HashMap

我得到了一个 .txt 文件,其中包含总共 100 万首歌曲及其各自的作者。我给定的任务是在 python 中编写一个 HashMap,它可以使用作者或歌曲作为键来存储这些信息。我编写了一个 HashMap,它可以工作,但运行速度非常慢,最多需要 2 分钟才能完成。 (根据我的导师的说法,预计时间显然最多几秒钟)

对于冲突处理,我决定使用链表,因为从我收集到的信息来看,这是一种处理冲突的有效方法,同时不会显着降低性能

from HashNode import HashNode

class HashTabell:

    def __init__(self,size):
        self.size = size
        self.dict = {}
        self.krock = 0

    def store(self,nyckel,data):
        hashval = self.__hash(nyckel)

        ## Shit is empty
        if self.dict.get(hashval) != None:
            get_val = self.dict[hashval]

            ## Is list,append normally
            if isinstance(get_val,list):
                list2 = self.dict[hashval]
                found = False

                for (k,val) in enumerate(list2):
                    if val.get_nyckel == nyckel:
                        list[k] = HashNode(nyckel,data) ## Update old value
                        found = True
                        break

                if found:
                    self.dict[hashval] = list2
                else:
                    self.dict[hashval] = get_val + [HashNode(nyckel,data)]
                    self.krock += 1
            else:
            ## Create list
                if get_val.get_nyckel() == nyckel:
                    self.dict[hashval] = HashNode(nyckel,data) ## Update old value
                else:
                    self.dict[hashval] = [get_val,HashNode(nyckel,data)] ## Append to existing node
                    self.krock += 1

        else:
            self.dict[hashval] = HashNode(nyckel,data)

    def __getitem__(self,nyckel):
        return search(nyckel)

    def __contains__(self,nyckel):
        return (search(nyckel) != None)

    def search(self,nyckel):
        hashval = self.__hash(nyckel)

        ## Get val
        get_val = self.dict.get(hashval)
        if get_val == None:
            raise KeyError("Key not found")

        ## Check if has multiple entries or not
        if isinstance(get_val,list):
            ## Multiple
            for value in get_val:
                if(get_val.get_nyckel() == nyckel):
                    return get_val
            raise KeyError("Key not found")
        else:
            ## Single
            if get_val.get_nyckel() == nyckel:
                return get_val
            else:
                raise KeyError("Key not found")

    ## Hash function
    def __hash(self,input):
        inp = str(input) ## Get chars
        value = 0

        for k in input:
            value += ord(k)

        return (value % self.size)


    def get_dict(self):
        return self.dict

    def get_krock(self):
        return self.krock

HashNode 类很简单:

class HashNode:
    def __init__(self,data):
        self.nyckel = nyckel
        self.data = data

    def get_nyckel(self):
        return self.nyckel

    def get_data(self):
        return self.data

过去 2 周我一直对这个问题视而不见,我没有从我的讲师/助理那里得到任何帮助,非常感谢有关如何提高速度的任何建议。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。