PHP:在数据库中查找一组总和为特定数字的数字

塔玛拉

首先,我是一名php新手...因此,我仍然会编程和理解php。那就是

我有一个存储在数据库中的数字(金额)集合。

问题:使用PHP和mySQL,

  1. 什么是从数据库中后台存储此信息的最佳方法,以使金额与其交易ID相关联

  2. 最重要的是,我需要在db中找到一个匹配的数字集,其总和为29

以下是Transaction_tlb我的数据库的交易表,mydb

    Transaction_ID |     Name         |       Date      | Amount
    ---------------|------------------|-----------------|------------ 
    11012          | Jonathan May     |   6/12/2016     |     84
    21012          | John Pedesta     |   6/12/2016     |     38
    31012          | Mary Johnson     |   1/01/2017     |     12
    41012          | John Johnson     |   8/01/2017     |     13
    51012          | Keith Jayron     |   8/01/2017     |     17
    61012          | Brenda Goldson   |   8/01/2017     |     2
    71012          | Joshua Traveen   |   8/01/2017     |     78
    81012          | Remy ma Goldstein|   8/01/2017     |     1
    91012          | Barbie Traveen   |   8/01/2017     |     1

现在,我有一个主意..但效率不高。我将尝试所有可能的情况。这意味着如果我要检查n个值,则时间复杂度将约为2 ^ n。这是非常低效的(另外,我什至不知道我的代码是否有意义。(请参阅下文

我在以下YouTube视频中看到了类似的示例:https : //www.youtube.com/watch?v=XKu_SEDAykw&t

但是,我不确定确切如何在php中编写代码。

编码:

<?php
  if (!mysql_connect("localhost", "mysql_user", "mysql_password") || !mysql_select_db("mydb")) {
      die("Could not connect: " . mysql_error()); } //End DB Connect

  $capacity = 29; //Knapsack Capacity or Sum

  //Select Transact ID and Value from the Database where Amount is <= Capacity
  $fetchQuery = "SELECT 'Transaction_ID', 'Amount' FROM 'Transaction_tlb' WHERE 'Amount' <= $capacity"; 

  $components = array(); //new array to hold components

  if ($queryResults = mysql_query($fetchQuery)) {

     //check if data was pulled
     if (mysql_num_row($queryResults) != NULL) {
        while ($row = mysqli_fetch_assoc($queryResults) {
           $components[$row['Transaction_ID']] = $row['Amount'];
        }
     }
  }

  /* Correct me if i am wrong, but, Components associative array Should be something like
  $components = array('11012'=> 84, '21012'=> 38, '31012'=> 12, '41012'=> 13, '51012'=> 17, 
                      '61012'=> 2, '71012'=> 78, '81012'=> 1, '91012'=> 1);
  */

  $components = asort($components) // sort array in ascending order
  $componentCount = count($component)


  function match ($componentCount, $capacity) {
              $temp = match (($componentCount - 1), $capacity);
              $temp1 = $component[$componentCount] + match (($componentCount - 1), ($capacity - $component[$componentCount]));
              $result = max($temp, $temp1);
         return $result;
         }
}?>

谁能给我指出正确的方向?该代码不起作用...即使它起作用...该方法也根本无效。我有300万条记录可以使用时会发生什么?我需要帮助。

可能

您可以根据0/1背包问题来表达问题提供了PHP中的即用型实现

使用knapSolveFast2链接页面中定义的功能,可以按以下示例进行操作。这里的想法是,将输入背包算法的“权重”设置为等于值本身。

$components = array(84, 38, 12, 13, 17, 2, 78, 1, 1);

$m = array();
list($m4, $pickedItems) = knapSolveFast2($components, $components, sizeof($components)-1, 29, $m);

echo "sum: $m4\n";
echo "selected components:\n";
foreach($pickedItems as $idx){
    echo "\t$idx --> $components[$idx]\n";
}

产生:

sum: 29
selected components:
    2 --> 12
    4 --> 17 

笔记:

  • 您可以修改SQL查询,以跳过amount大于所需总和的行(29)
  • 上面的函数将选择一个解决方案(假设它存在),但不会提供所有解决方案
  • 应该检查返回值$m4是否确实等于指定的总和(29)-随着算法的工作,指定的数量只是不能保证达到的上限(例如,返回值不是37,而不是29只有34,因为没有输入数字的组合,其总和将得出37)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何过滤存储在数据库中的一组特定用户?

在数字中的特定数字处查找数字

在数组中查找特定数字?

使用一组数字相加为特定数字

在数字列表python中查找特定数字

将特定字母替换为范围数字,并使用php在数据库中搜索

在数组中查找一组数字的起点和终点

生成总和为给定数字并符合一组一般约束的随机自然数

我只能将数字存储在数据库中,而php是一个简单的shoutbox

Oracle:如何添加约束以仅允许字符串列中的一组特定数字

SQL:如何在数据库中搜索列名(在一组表中)

查找一组数字的所有组合,这些数字的总和等于某个总数

使用 t-sql 从一组特定数字中获取 6 个数字的所有组合

如何在go-lang中创建一组正态分布的数字,围绕特定数字设置

获取一组给定数字中具有相同数字频率的组数

为每个结果分配一个数字,而无需在数据库中添加列-Laravel

在数据库中查找数字范围内的间隙

一栏中特定数字的总和(Google表格)

查找最接近特定数字的数字总和

检查在一组数字中,数字n是否等于其子集的总和

过滤列中一组给定数字中可用的数字

在php中以三为一组分配大量数字

一种方法或函数,它返回一组总和为 5 的数字对

在phpmyadmin数据库中返回满足一组特定条件的用户

在Excel中的一系列单元格中从逗号分隔的一组数字中计算特定数字

在数据库Rails中存储动态数字

如何将一组项目(主题)保存到列表中并保存在数据库中

使用一组给定数字生成直到固定数字的递增数字的算法

标识数据库中的一组条目