Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从2^24个值到2^7索引的有效映射_Algorithm_Performance_Search_Data Structures_Mapping - Fatal编程技术网

Algorithm 从2^24个值到2^7索引的有效映射

Algorithm 从2^24个值到2^7索引的有效映射,algorithm,performance,search,data-structures,mapping,Algorithm,Performance,Search,Data Structures,Mapping,我有一个数据结构,其中存储了一个24位宽的值。我有很多这样的东西 为了最小化存储成本,我计算了2^24个可能值中的2^7个最重要的值,并将它们存储在一个静态数组中。因此,我只需要在数据结构中为该数组保存一个7位索引 问题是:我得到这些24位的值,我必须在运行中将它们转换为我的7位索引(不可能进行预处理)。计算基本上是搜索2^7个值中哪一个最适合。显然,对于大量对象,这需要一些时间 一个显而易见的解决方案是创建一个长度为2^24的简单字节映射数组。但这需要16MB的内存。太多了 16 MB阵列的一

我有一个数据结构,其中存储了一个24位宽的值。我有很多这样的东西

为了最小化存储成本,我计算了2^24个可能值中的2^7个最重要的值,并将它们存储在一个静态数组中。因此,我只需要在数据结构中为该数组保存一个7位索引

问题是:我得到这些24位的值,我必须在运行中将它们转换为我的7位索引(不可能进行预处理)。计算基本上是搜索2^7个值中哪一个最适合。显然,对于大量对象,这需要一些时间

一个显而易见的解决方案是创建一个长度为2^24的简单字节映射数组。但这需要16MB的内存。太多了

16 MB阵列的一个观察结果:平均31个连续值相同。不幸的是,也有许多不同的连续值



您将如何实现从24位值到7位索引的转换,以尽可能节省CPU和内存?

您有多少2^24个索引?您可以对这些值进行排序,并通过计算连续值的数量来计算它们吗

如果不知道“最佳匹配”的定义,很难说。也许a会允许基于某种度量或其他度量的接近度进行合适的搜索,这样您就可以快速排除大多数候选者,并且只需要实际测试2^7中的一些,以确定哪一个是最好的

这听起来类似于图像处理器在缩小到较小的调色板时遇到的问题。实际上我不知道使用了什么算法/结构,但我确信它们是可以查找的,并且可能会有所帮助。

作为一个想法。。。 将索引表增加到8位,然后将24位字的所有3个字节进行异或运算。 然后,您的表将包含这个8位散列值,加上返回原始24位值的索引

由于您的数据类似于RGB,因此可能需要更复杂的哈希方法



是的,你的想法是正确的。很有可能24位值中的一个或多个将散列到同一索引,这是由于


解决哈希冲突的一种方法是使用某种链接

由于您已经知道需要保留的2^24个值中的哪一个(即您确定为重要的2^7个值),我们只需过滤传入数据,并在遇到这些值时为其分配一个值,从0开始,直到2^7-1。当然,我们需要一些方法来跟踪我们已经看到的重要值,并在[0,2^ 7 ]中分配一个标签。对于这个,我们可以使用一些树或基于哈希表的字典实现(例如,C++中的代码> STD::MAP< /CUL> >,<代码> HashMap < /C> >或<代码> TeMeMeP < /C> >爪哇,或者在Python中<代码> DICT< /Cord>。

代码可能如下所示(我使用的值范围要小得多):


通过对一组重要值使用基于哈希/树的集合数据结构,可以使搜索速度更快。这将使整个过程
O(n*log(k))
(或者
O(n)
,如果它是一个哈希表)其中n是输入的大小,k是一组重要值。

另一个想法是将重要值放在一个不同的数组中,然后只需先搜索它。如果在那里找不到可接受的答案,那么您可以不寒而栗地搜索更大的数组。

另一个想法是在位图中表示24位值数组nsigned char可以保存8位,因此需要2^16个数组元素。这是65536。如果设置了相应的位,则您知道数组中存在特定的24位值,需要进行检查

我们需要一个迭代器来遍历数组并找到下一个设置位。有些机器实际上在其指令集中提供了“查找第一位”操作

祝你好运。 让我们知道事情的结果


邪恶。

你在用什么编程,16MB太多了?一部电话?@Steve如果16MB不太多,他一开始就不会这么做:)@Karl:如果他说16MB太多是对的,他一开始就不会这么做。但是,如果他错了,他会:-)这就是为什么这是一个评论,而不是答案。实际上我的问题是修辞性的。我不需要答案,只是有时候人们(包括我)不会质疑我们的限制,直到其他人质疑。如果你有“最重要的”值,为什么不把所有不太重要的值都扔掉呢?@Steve:是的,它在电话上:-)色板问题确实是类似的。我会尝试在Google上找到一些代码。这些24位的值是向量(x,y,z-每个8位)。最佳匹配意味着"找到索引值和当前值之间的最大点积。@Lars:Hmm。如果重要向量都具有相同的大小,这听起来很容易缩小范围,如果它们不具有相同的大小,则不会缩小范围。2^24值使用所有位。因此,所有可能的2^24值都可以出现任意次数,您想知道每个值出现多少次数字在不使用太多内存的情况下出现。我只能假设您的原始数据结构不在内存中,因为这将需要使用远远超过您所说的16 MB的内存。我不确定是否完全理解您的答案。a)如何使用xor 3字节?(b1^b2)^b3?b)我的表将由8位散列值和返回到24位值的索引列表组成?!
 bit24var        & 0x000f gives you the right hand most char.
(bit24var >> 8)  & 0x000f gives you the one beside it.
(bit24var >> 16) & 0x000f gives you the one beside that.
import random

def make_mapping(data, important):
    mapping=dict() # dictionary to hold the final mapping
    next_index=0 # the next free label that can be assigned to an incoming value
    for elem in data:
        if elem in important: #check that the element is important
            if elem not in mapping: # check that this element hasn't been assigned a label yet
                mapping[elem]=next_index
                next_index+=1 # this label is assigned, the next new important value will get the next label 
    return mapping

if __name__=='__main__':
    important_values=[1,5,200000,6,24,33]
    data=range(0,300000)
    random.shuffle(data)
    answer=make_mapping(data,important_values)
    print answer