- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
代码在 C 中。我有两种具有父子关系的对象(结构
),一种父类型可以有 0
或更多子对象-类型,一个 child 不能有自己的 child 。我需要 O(1)
父查找(通过 uID
结构成员)和子查找(也通过 uID
结构成员)而不知道谁是它的父.一旦获得指向父项的指针,我希望能够遍历其子项。当我有一个指向 child 的指针时,我希望能够知道谁是它的 parent 。在程序执行期间,可以删除或插入任何子项或任何父项,并且子项可以更改其父项。当 parent 被移除时,它的 child 也应该被移除。所有这一切都应该在多线程环境中完成,所以我需要线程安全的读取(我将使用只读锁进行键搜索,使用读写锁进行插入/删除/重新设置)。你会推荐什么数据结构?
添加:
目前我正在尝试使用 uthash 库 ( http://uthash.sourceforge.net/ ) 来实现它:
struct parent
{
uint64_t uid;
time_t mtime;
struct ldata data;
struct child *first_child;
UT_hash_handle hh;
};
struct child
{
uint64_t uid;
time_t mtime;
struct ldata data;
struct parent *parent;
UT_hash_handle hh;
};
struct parent *parents_list = NULL;
struct child *children_list = NULL;
问题是当一个新的 child 到达时它最终在尾部并且与其“兄弟”无关。
最佳答案
怎么样:
哈希表可能不是完全 O(1) 查找,但它们会很接近。您或许可以为它们使用一个现有的、完善的库。
在线程安全方面,您可以为两个散列(用于项目插入/删除)设置互斥锁,并且在每个父代中也有一个互斥锁,以便在操作它或它的任何子代时使用。当然要小心死锁:例如如果更改 child 的 parent 需要同时锁定旧 parent 和新 parent ,请确保以一致的顺序进行!
当然,找到无锁结构会更好,但我不能在这方面给你真正的建议,除非你研究一下,看看你是否能找到任何看起来合适的结构。
关于c - 请就我应该使用哪种数据结构提出建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10042366/
我正在尝试使用 ksoap2 库版本 3.6.2 向 SOAP API 发出请求。 问题是我收到错误消息: "SoapFault - faultcode: 'soap:Server' faultstr
我是 python 3(和一般的 python)的新手,我决定尝试以我自己的方式制作密码和解密作为个人项目。密码通过生成一个随机数并将字母数值乘以它来工作。它将所有这些相乘的值添加到一个列表中,然后在
我在我的 objective-c 项目中使用第 3 方外部框架。我在这个项目中创建了一个 swift 文件来使用该框架。 在 MyModule-Bridging-Header.h 我导入了外部框架头文
目前 .slcache 目录位于 %USER_HOME%\.grails\.slcache里面有大约 12M 的数据。我在受限的公司环境中工作,这导致我的 Windows 配置文件分配出现问题(遗憾的
因此,我目前正在开发一个利用 Google Places API 的原型(prototype),并且正在努力处理此处显示的 API 文档:https://developers.google.com/p
以下代码: t = paramiko.Transport((hostname, port)) t.connect(username=username, password=passwor
我可以在 GitHub 上对其他人的 Gist 提出 pull 请求吗? 我知道我拥有的 Gist 的 fork 、克隆和提交工作流程。我想知道我是否可以请求用我的 fork 更新别人的 Gist 。
我有下一个方法调用: Formatting.git_log_to_html(`git log --no-merges master --pretty=full #{interval}`) interv
我需要一条 sql 语句(或者如果效率更高的话我可以用 Java 执行)来显示汇总表。当我只显示一列统计信息时,它会按我的预期显示: SELECT refresh_job_detail.refres
我是一名优秀的程序员,十分优秀!