- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个表面上看起来很简单的问题,我想用 ruby 来解决,我有一堆颜色和相关的照片 ID,例如
[[1,"red"],[1,"green"],[2,"red"],[3,"yellow"],[4,"green"],[4,"red"]]
我希望处理数据,使其成为这种格式:
红色、绿色2张照片
3张照片为红色
1 张照片为黄色
一些注意事项:
匹配最多颜色的照片/照片在列表中排在第一位,如果匹配的颜色数量相同(如上面的红色和黄色),则将最高数量放在第一位。
<红色的计数为 3,因为 2 张照片有红色和绿色,而第三张只有红色。我不会单独显示绿色的结果,因为所有绿色照片都包含红色和绿色条目。
最终,无论数据集有多大,我只需要显示前 5 个结果。
我已经编写了一个实现此目标的算法(见下文),但我将不胜感激有关如何使其更快、更优雅的任何指导。速度是首要考虑因素,我将对大量数据(百万级订单)进行操作,然后如果可能的话,如果它可以变得更优雅,那会很好——我不认为我写的是优雅的 ruby 代码,我有一个c++背景。
我知道在 ruby 中嵌入 c 和 c++ 代码以提高性能,但我真的很想只使用 ruby 来实现这一点。
非常感谢
beginning = Time.now
ARR = [[1,"red"],[1,"green"],[2,"red"],[3,"yellow"],[4,"red"],[4,"green"],[4,"yellow"],[5,"green"],[5,"red"],[6,"black"]]
# Group the colours by their id.
groups = ARR.group_by {|x| x[0]}
# output for profiling.
puts "After Group BY: #{Time.now - beginning} seconds."
# Remove the id's, as they are no longer useful. Sort the colours alphabetically.
sorted_groups = []
groups.each do |i,j|
sorted_groups << j.map!{ |x| x[1]}.sort
end
# Order the colours, so the group containing the most colours comes first.
# Do a secondary sort alphabetically, so that all identical groups are next to each other.
sorted_groups_in_order = sorted_groups.sort_by { |s| [s.length,s] }.reverse
# Traverse the groups in order to find the index that marks the position of results_to_return unique groups.
# This is to make subsequent processing more efficient, as it will only operate on a smaller subset.
results_to_return = 5
temp = sorted_groups_in_order[0]
combination_count = 0
index = 0
sorted_groups_in_order.each do |e|
combination_count +=1 if e != temp
break if combination_count == results_to_return
index += 1
temp = e
end
# Iterate through the subset, and count the duplicates.
tags_with_count = Hash.new(0)
sorted_groups_in_order[0..index].each do |v|
tags_with_count.store(v,tags_with_count[v]+1)
end
# Sort by the number of colours in each subset, the most colours go first.
tags_with_count = tags_with_count.sort { |q,w| w[0].size <=> q[0].size }
# if colour subsets are found in colour supersets, then increment the subset count to reflect this.
tags_with_count.reverse.each_with_index do |object,index|
tags_with_count.reverse.each_with_index do |object2,index2|
if (index2 < index) && (object[0]&object2[0] == object2[0])
object2[1] += object[1]
end
end
end
# Sort by the number of colours in each subset, the most colours go first.
# Perform a secondary sort by the count value.
tags_with_count = tags_with_count.sort_by { |s| [s[0].length,s[1]] }.reverse
# print our results.
tags_with_count.each do |l|
puts l.inspect
end
# output for profiling.
puts "Time elapsed: #{Time.now - beginning} seconds."
最佳答案
查看我的 new answer反射(reflect)修改后的规范
假设您有 > 1.8.7,您可以使用 Array.combination。否则你需要安装 ruby 置换 gem:
http://permutation.rubyforge.org/
然后。 . .
data = [[1,"red"],[1,"green"],[2,"red"],[3,"yellow"],[4,"green"],[4,"red"]]
# get a hash mapping photo_id to colors
colors_by_photo_id = data.inject(Hash.new {|h,k| h[k] = []}) do |h,a|
h[a.first] << a.last
h
end
# could use inject here, but i think this is more readable
total_counts = Hash.new{|h,k| h[k] = 0}
# add up the sum for all combinations
colors_by_photo_id.values.each do |color_array|
1.upto(color_array.size).each do |i|
color_array.combination(i){|comb| total_counts[comb.sort] += 1}
end
end
>> total_counts
=> {["green", "red"]=>2, ["red"]=>3, ["yellow"]=>1, ["green"]=>2}
# or if you want the output sorted:
>> total_counts.to_a.sort_by{|a,c| -c}
=> [[["red"], 3], [["green", "red"], 2], [["green"], 2], [["yellow"], 1]]
关于ruby - Ruby 颜色分组统计算法优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238966/
我目前正在学习数据挖掘,有以下问题。 机器学习和数据挖掘之间有什么关系? 我发现许多数据挖掘技术都与统计相关,而我“听说”数据挖掘与机器学习有很多关系。所以我的问题是:机器学习与统计学密切相关吗? 如
我有很多表的数据,例如: event_id player finish 1 a 1 1 b 2 1 c
我对 http_status_module 提供的统计数据感兴趣 特别是上游部分的统计数据。 http://nginx.org/en/docs/http/ngx_http_status_module.
除了 Cluster MBean 之外,是否有任何可以在 Akka (Java) 中启用的内置 JMX 公开监控/统计信息?我看过 Typesafe Console,但由于它需要许可证才能用于从多个节
我正在尝试在我的程序中使用“usage”统计信息来获取类似于 time 的数据工具。但是,我很确定我做错了什么。这些值似乎是正确的,但有时可能有点奇怪。我没有在网上找到好的资源。有人知道如何做得更好吗
我有一个带有统计表的 MySQL 数据库。我想以年历、月度的形式输出数据。对于没有点击率的几个月,我想花费一个“空”DIV。有两个ID。 $query = mysqli_query($db,"SELE
设置: 问题是经典概率问题的复杂形式: 70 colored balls are placed in an urn, 10 for each of the seven rainbow colors.
有哪些 Ruby gem 可以执行数据处理? 最佳答案 我知道有 3 种从 Ruby 访问 R 的方法: RinRuby RSRuby 通过 Rserve-Ruby-Client 预约 RinRuby
背景 图像领域内的一个国内会议快要召开了,要发各种邀请邮件,之后要录入、统计邮件回复(参会还是不参会等)。如此重要的任务,老师就托付给我了。ps: 统计回复邮件的时候,能知道谁参会或谁不参会。
我正在添加用户输入的几个数字并将它们添加到数组列表中。 到目前为止我的代码: package project143; import java.util.*; /** * @author -- */
正如标题所示,我需要做的是在各种 iO/Android/Windows 应用程序中跟踪各种用户事件 - 例如点击、滑动、在页面上花费的时间等。 这些应用程序基于响应式 HTML/CSS/JS,并具有简
我希望计算 HTML 表中每个唯一值的实例数,并在其自己的表中返回结果。该表是根据用户的文本输入生成的。例如,用户输入可能如下所示: Report 46 Bob Marley 4/20/2
如何使用 PHP 计算数字数组的 z 分数?我需要计算 z 分数,然后找到百分位数 (CDF)!我可以使用哪些 PHP 函数?谢谢! 最佳答案 以下代码将给出 CDF 的良好近似值(Abramowit
我只是想知道是否可以计算 GitHub 上空存储库的总数。 如果不适合所有用户,可以为自己做吗? 编辑 我已经尝试过size:0搜索,但似乎返回了很多包含数据的存储库。采用 size:0..1 之类的
public class Scanner { private HtmlProcessor hp; private String baseUrl; private int ste
我正在使用 Mule ESB 3.4。我想开发一个自定义 Java 组件来计算流收到的请求数量。流程将例如像这样: http inbound-endpoint -> counter -> vm-out
我喜欢借助 GitHub API 来统计存储库中所有开放的拉取请求和问题。我发现 API 端点 /repos/:owner/:repo 结果包含 open_issues 属性。然而,这是问题和拉取请求
如何使用 PHP 计算数字数组的 z 分数?我需要计算 z 分数,然后找到百分位数 (CDF)!我可以使用哪些 PHP 函数?谢谢! 最佳答案 以下代码将给出 CDF 的良好近似值(Abramowit
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试以编程方式获取搜索字词列表的 Google 新闻搜索结果计数(即有多少个结果),但仅限于过去 1 年。使用用户界面搜索时,结果计数仅出现在常规搜索中,但在“工具 > 最近 > 过去一年”下时
我是一名优秀的程序员,十分优秀!