- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想制作“压缩数组”/“压缩 vector ”类(详情如下),它允许随机数据访问或多或少的常数时间。
“或多或少恒定时间”意味着虽然元素访问时间不是恒定的,但当我接近数组的某个点时它不应该继续增加。 IE。容器不应该做更多的计算(比如“再次解压所有东西以获得最后一个元素”,以及“几乎不做任何事情来获得第一个元素”)来获得一个元素。可以通过将数组拆分为压缩数据 block 来实现。 IE。访问一个元素应该采取 "averageTime"+- 一些偏差。我可以说我希望最好情况下的访问时间和最坏情况下的访问时间相对接近平均访问时间。
我有哪些选择(合适的算法/已经可用的容器 - 如果有的话)?
容器详细信息:
使用示例:
对数据进行二分查找。
数据详情:
1. 数据是主要由 float 和一些整数组成的结构。 float 多于整数。没有字符串。
2. 数组中不太可能有很多相同的元素,所以简单地索引数据是不可能的。
3. 一个元素的大小小于100字节。
4. 每个容器的总数据大小在几千字节到几兆字节之间。
5. 数据不是稀疏的——它是连续的元素 block ,所有元素都被赋值,没有“空槽”。
与未压缩的数组形式相比,压缩的目标是减少 block 占用的内存量,同时保持合理的读取访问性能,并允许随机访问数组元素。 IE。数据应该在内部以压缩形式存储,我应该能够像访问 std::vector 或类似容器一样访问它(只读)。
想法/意见?
最佳答案
我认为您需要一个数组,其元素不是原版存储,而是压缩,以最大限度地减少内存使用。
关于压缩,您对数据的结构没有特别的了解,因此您可以使用某种标准的熵编码。理想情况下,希望在整个阵列上运行 GZIP 并完成它,但这会失去 O(1) 访问权限,这对您来说至关重要。
一个解决方案是使用Huffmann coding连同一个索引表。
霍夫曼编码的工作原理是将每个输入符号(例如,ASCII 字节)替换为另一个可变 位长度的符号,具体取决于整个流中出现的频率。例如字符E
出现的频率很高,所以它的位序列很短,而'W'很少出现,位序列很长。
E -> 0b10
W -> 0b11110
现在,用这个方法压缩你的整个数组。不幸的是,由于输出符号的长度可变,您无法再像以前那样为数据编制索引:项目编号 15 不再位于 stream[15*sizeof(item)]
中。
幸运的是,这个问题可以通过使用额外的索引表 index
来解决,该表存储每个项目在压缩流中的开始位置。换句话说,第 15 项的压缩数据可以在 stream[index[15]]
中找到;索引表累积可变输出长度。
因此,要获得第 15 项,您只需开始解压缩 stream[index[15]]
中的字节即可。这是可行的,因为霍夫曼编码不会对输出做任何花哨的事情,它只是连接新的代码字,您可以在流内部开始解码,而无需解码所有以前的项目。
当然,索引表增加了一些开销;您可能需要调整粒度,以便 压缩数据 + 索引表
仍然小于 原始数据
。
关于c++ - 具有随机数据访问的压缩 vector/数组类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3423968/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!