- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
注意:这个问题是昨天深夜发的,没有得到足够的答复。我添加了一些细节并重新发布。
作为一项任务,我的任务是创建中位数排序的中位数,它还可以确定数组的第 n 个最小元素(即排序数组的索引 0 是第一个最小的元素)。这种排序是递归的,这导致我在理解它时遇到问题,因为我没有广泛使用递归。
通过拼凑教程和对算法的研究,我已经非常接近于成功创建该方法;但是,我目前正在返回错误的值。当我希望它返回索引 0 处的值时,QS(A, 1) 的输入将返回索引 1 处包含的值:
public static int QS(int[] A, int k){
List<Integer> AList = new ArrayList<Integer>();
if(k < 1 || k >= A.length){
System.out.println("Code called because k = "+k);
return -1;
}
for (int i = 0; i < A.length; i++){
AList.add(A[i]);
}
if (AList.size() < 14) {
Collections.sort(AList);
return AList.get(k);
}
ArrayList<Integer> medians = new ArrayList<Integer>();
for (int i = 0; i < AList.size() - AList.size() % 7; i = i + 7){
medians.add(medianFind(AList.subList(i, i + 7)));
}
int a = medianFind(medians);
ArrayList<Integer> left = partitionFind(AList, a, true);
ArrayList<Integer> right = partitionFind(AList, a, false);
int[] leftArray = new int[left.size()];
int[] rightArray = new int[right.size()];
for(int i = 0; i < left.size(); i++){
leftArray[i] = left.get(i);
}
for(int i = 0; i < right.size(); i++){
rightArray[i] = right.get(i);
}
if(left.size() + 1 == k){
return a;
}
else if(left.size() > k){
return QS(leftArray, k);
}
else{
return QS(rightArray, k - left.size());
}
}
/////////
public static int medianFind(List<Integer> AList) {
Collections.sort(AList);
return AList.get(AList.size() / 2);
}
/////////
public static ArrayList<Integer> partitionFind(List<Integer> AList, int b, boolean lessThan) {
ArrayList<Integer> store = new ArrayList<Integer>();
for (int element : AList)
if (element < b && lessThan)
store.add(element);
else if (element >= b && !lessThan)
store.add(element);
return store;
}
为了将最终返回的索引修改为 -1,我费了很大劲才想明白这个算法中的递归。我不能简单地进行以下更改:
if (AList.size() < 14) { //old
Collections.sort(AList);
return AList.get(k);
}
if (AList.size() < 14) { //new
Collections.sort(AList);
return AList.get(k-1);
}
因为这有时会导致 return QS(rightArray, k - left.size())
被传递一个小于 1 的参数。我也不认为我可以添加:
if(nothing left to sort){
return AList.get(k-1)
}
由于算法的递归性质而声明。我已经这样做了很长一段时间但没有成功,如果有任何指示我应该去哪里解决这个问题,我将不胜感激。
最佳答案
//returns the k^th smallest element in the array A for 0<k<A.length
public static int QuickSelect(int[] A, int k){
List<Integer> AList = new ArrayList<Integer>();
if(A.length<k||k<1){
System.out.println("k out of range, got k: "+k +", but A.length: "+A.length);
return -1;
}
for (int i = 0; i < A.length; i++){
AList.add(A[i]);
}
此时我们知道AList.size()>0
,所以得到元素k-1,也就是列表中第k小的元素
if (AList.size() < 14) {
Collections.sort(AList);
return AList.get(k-1);
}
ArrayList<Integer> medians = new ArrayList<Integer>();
for (int i = 0; i < AList.size() - AList.size() % 7; i = i + 7){
medians.add(medianFind(AList.subList(i, i + 7)));
}
***你忘了找到最后一个 AList.size()-( AList.size() % 7)
元素的中位数
int a = medianFind(medians);
ArrayList<Integer> left = partitionFind(AList, a, true);
ArrayList<Integer> right = partitionFind(AList, a, false);
添加了 med
变量来计算中位数的出现次数
int med=AList.size()-(left.size()+right.size())
int[] leftArray = new int[left.size()];
int[] rightArray = new int[right.size()];
for(int i = 0; i < left.size(); i++){
leftArray[i] = left.get(i);
}
for(int i = 0; i < right.size(); i++){
rightArray[i] = right.get(i);
}
不完全确定其余部分的逻辑,但我认为以下内容更有意义(注意我修改了 PartitionFind)
if(left.size() >= k){
return QuickSelect(leftArray, k);
}
else if(left.size()+med<k){
return QuickSelect(rightArray, k-(left.size()+med));
}
else{
return a;
}
}
/////////
public static int medianFind(List<Integer> AList) {
Collections.sort(AList);
return AList.get(AList.size() / 2);
}
/////////
注意:我对此进行了修改,使子问题变得更小(o.w. 例如,您可以将 b 作为列表中最大的元素,并且右数组仍将包含整个列表)
public static ArrayList<Integer> partitionFind(List<Integer> AList, int b, boolean lessThan) {
ArrayList<Integer> store = new ArrayList<Integer>();
for (int element : AList)
if (element < b && lessThan)
store.add(element);
else if (element > b && !lessThan)
store.add(element);
return store;
}
让我知道这是否有效
关于java - 修改在中位数快速排序中找到的第 k 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574549/
基本上在 excel 中,我想要一个表格,就像下面右边给出的那个(我的数据规模比给出的例子大很多),它有每个主题的中位数,每个条件(例如 TADA、TADP、TPDA , TPDP)。理想情况下,我会
我有一个大小为5000 * 5000的矩阵,其90%的值为0。是否有现成的解决方案可用来计算排除“0”后该矩阵的均值,中位数? 一种粗制解决方案是将所有0更改为NA并使用 median(x, na.
这个问题已经有答案了: Mean per group in a data.frame [duplicate] (8 个回答) 已关闭 9 年前。 我有一个数据框,详细记录了客户花了多少钱,如下所示:
这是我的代码,用于打印所有职业的平均值和中位数。 occupation_lst = ['ALL OCCUPATIONS', 'MANAGEMENT', 'Chief executives', 'Gen
我的 csv 文件中有一个数据集,如下所示: teacher student student grade Jon marin
如何在 C 中不使用数组的情况下找到一组数字的平均值、中位数?问题不是找到平均值或中位数的方法,而是如果不允许使用数组,如何存储一组数字并对它们执行一些操作? 最佳答案 一个有趣的问题。 关键是找到一
我正在使用 SQL Server 2008 如果我有这样的表: Code Value ----------------------- 4 240 4 299 4 21
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我需要从输入文件中查找平均值、中位数、众数和范围。 [input file has the numbers{60,75,53,49,92,71}] 我不知道如何打印范围内的计算结果或计算众数。 这很糟
这个问题已经有答案了: Division of integers in Java [duplicate] (7 个回答) 已关闭 7 年前。 public static double calcMed
当我输入 1,2,3 时我的中位数计算有问题我的中位数是 = 44 我不知道为什么 double wynik = 0; string x1 = textBox1.Text; string[] tab
我的中位数 3 实现在这里运行不正常。我必须为媒体随机选择 3 个数字,这是我的代码,请帮助我。 #include"stdafx.h" #include #include using namespa
我有一个文件,其中有如下几秒钟的数字: 0.01033 0.003797 0.02648 0.007583 0.007491 0.028038 0.012794 0.00524 0.019655 0.
是否有任何函数(作为数学库的一部分)可以计算 mean 、中位数、众数和范围来自一组数字。 最佳答案 是的,似乎确实有第三个库(Java Math 中没有)。出现的两个是: http://opsres
我目前正在尝试从具有两个条件的一系列数据中提取中位数。本质上相当于下面的 AVERAGEIFS(),我工作得很好。 AVERAGEIFS(): =AVERAGEIFS(Analysis!$F:$F,A
我有一个 pandas 数据框,看起来像这样: 给定行中的每个值要么是相同的数字,要么是 NaN。我想计算数据框中所有两列组合的平均值、中位数和获取计数,其中两列都不是 NaN。 例如,上述数据帧的结
我有以下数据: [4.1, 4.1, 4.1, 4.2, 4.3, 4.3, 4.4, 4.5, 4.6, 4.6, 4.8, 4.9, 5.1, 5.1, 5.2, 5.2, 5.3, 5.3, 5
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
一组整数作为输入。您必须返回该集合的子集,以便该子集的均值 - 中位数最大。 示例 1 输入 {1,2,3,4} 输出 {1,2,4} 例子2 输入 {1,2,2,3,3} 输出 {2,2,3} 最佳
我是一名优秀的程序员,十分优秀!